執筆バージョン: Unreal Engine 5.6
|
1.はじめに
3Dプラットフォーマーにおける横方向に動く床や、JRPGのフィールド移動中のエレベーターなど、ゲームを作っていると稀によく要求されることになるのが「動く足場」です。
UnrealEngineでは何もしなくても動く足場に乗って動くことができますが、少し工夫することでより良い体験に変えることができるので紹介していきます。
なお本ブログではCharacterMovementComponentを使用している一般的なキャラクターの作り方での解説となります。
参考用の画像についてはUE5.6のThirdPersonTemplateをもとに、動く足場を実装したうえで撮影しています。
2.基礎知識
キャラクタークラスにおける動く足場の扱いは、キャラクターが接地している足場を「BasedMovement」という構造体変数にキャッシュしたうえでキャラクターの速度情報による移動をした後に、足場の移動分だけ追加でキャラクターの座標を移動させる動作をしています。
つまりは「BasedMovement」がある間は足場の影響を受け、足場から離れると「BasedMovement」が空になるため足場の影響を受けなくなるといった動作になっています。
詳しく調べたい場合はUCharacterMovementComponentクラスのUpdateBasedMovement関数の中身や呼び出し箇所を見てみるとよいでしょう。

3.安定した動く足場の対応方法
デフォルトの設定では足場に接地している間は「BasedMovement」が存在し、ジャンプや移動などで足場から少しでも離れると「BasedMovement」が空になります。
このままだと移動する足場の上でジャンプしたときにキャラクターが空中に置き去りにされたり、ジャンプ中に足場が減速した際にキャラクターが止まらない等、
ゲームとしての操作性が希望通りにならない可能性が高いです。
この問題の対策としてはCharacterMovementComponentのbStayBasedInAir(空中に留まる)フラグを有効にすることが有効です。
このフラグが有効な場合、足場から一定の高さまでは離れていても「BasedMovement」が保持されるようになり、動く足場自体の加速や減速がそのままキャラクターにも影響を与えるようになるため、足場上での動作が安定します。



4.慣性の制御
慣性の法則とは、静止状態の物体は静止し続け、運動状態の物体はその速度のまま運動し続ける現象を指します。
本ブログで注目したいのが後者の「運動状態の物体はその速度のまま運動し続ける」部分です。
動く足場から飛び降りた際にはその動く足場の速度がそのまま維持されたほうが、現実に倣っているためより直感的な操作になりやすいです。
UnrealEngineではBasedMovementが空になる際に、自動的にキャラクターのVelocityに足場の速度を加算する処理が組み込まれているため、何もしなくても慣性による運動の保持が実装されているといえます。
ただしCharacterMovementComponentの設定で、空中での減速度が設定されていて、デフォルトの場合この値が高いため急に止まるように感じるかもしれません。
この設定はCharacterMovementComponentのBrakingDecelerationFallingの値を小さくすることでが有効です。
値を0にすると空中での減速を一切しなくなり、300程度の低い値を入れると気持ち空気抵抗で減速したように感じられます。


逆に足場から離れた際に慣性を全く与えたくない場合はbImpartBaseVelocityフラグを無効にすることで、キャラクターの速度に加算されなくなります。
このフラグはX,Y,Zと座標軸別に用意されているため、エレベーターから降りるときに飛んでいかないようにZ軸だけ無効にするなどが想定されるシチュエーションです。

5.足場の速度を考慮したキャラクターの速度の取得について
キャラクターの速度に応じて画面にエフェクトを出したり、画角を広げたたいといったシチュエーションが場合によってはあるかもしれません。
このときキャラクターのGetVelocityをすると、足場の速度情報が考慮されておらず移動をしていない場合Velocityは0が返ってきます。
CharacterMovementComponentのGetImpartedMovementBaseVelocity関数を呼ぶことで、キャラクターに影響を与えている足場の速度を取得することができます。
GetVelocityとGetImpartedMovementBaseVelocityの合計値が、World上におけるキャラクターの速度を求めることができます。



6.さいごに
今回はキャラクタームーブメントコンポーネントにおける足場の扱いに注目して動く足場についてまとめました。
ゲームごとに慣性を扱うか、あえて扱わないのかを意識することで、ユーザーの操作体験の向上につながりますので、ぜひ参考にしてください。