GameProgrammar's Night

ゲームプログラム系の覚え書き

UE4 FloatingPawnMovement を使う

 FloatingPawnMovementとは、UE4が用意している移動を担うComponentの一つです。
 CharacterMovementのように状態(歩き、ジャンプ、しゃがみ)があるわけでもなく、設定したパラメータ通りに位置を変化させるだけのシンプルな実装のMovementComponentです。
 シンプルですが2Dゲームで使うには十分な機能を持っており、自分のゲームでの移動はFloatingPawnMovementをメインに使っています。
 

移動させる

f:id:katze_7514:20161026154832p:plain

 移動させる時は、AddInputVectorノードを使います。
 FloatingPawnMovementは、移動させたい方向のベクトルを与えることで移動します。

●X+方向なら(1.0, 0.0, 0.0)
f:id:katze_7514:20161026161546p:plain

●45度方向だったら(cos45, sin45, 0.0)
f:id:katze_7514:20161026161554p:plain

 方向ベクトルの長さは「0.0~1.0」です。1.0以上与えても1.0として扱われます。この長さは、次に説明する速度パラメータのスケール値として働きます。

 AddInputVectorは呼ぶ度に方向ベクトルが加算されて行きます。FloatingPawnMovementのTickが呼ばれるまでの加算結果を用いて移動処理が実行されます。
 これを利用することで、Pawnの外部からの影響を受ける特殊な移動処理を簡単に実現することもできます。

ある地点に引っ張られる

 青いエフェクトが出ている間、通常の移動処理に加えて、中央に移動する方向ベクトルをAddInputVectorすることで実現しています。

速度パラメータ

 MovementComponentでの移動は、与えたベクトル方向に加速していき、最大の速さに到達したら速さアップを止めます。ベクトルの入力が無くなったら減速します。
 移動の調整は、それらのパラメータをいじることで行います。

f:id:katze_7514:20161026150207p:plain

パラメータ名 意味(単位)
Max Speed 最大の速さ(unit/sec)
Acceleration 加速度(unit/sec)
Deceleration 減速度(unit/sec)
Turning Boost 方向転換した際の追加加速スケール

 単位は、unit/secです。2Dゲームで、PPUを1.0に設定している場合は、pixel/sec と思って大丈夫です。

 TurningBoostは、どれだけ素早く方向転換できるか、ということを示すパラメータです。TurningBoostの値が大きいほど素早く方向転換が行われ、小さいほどゆっくり方向転換します。動作としては、方向転換する時だけ、加速度がTurningBoost倍されます。

 デフォルトの値では、加速も減速も方向転換も、かなり素早く行う設定となっています。そのため、すぐに最大の速さになりますし、ピタっと静止できるし、瞬間的に方向転換します。

慣性のある移動(滑りながら移動)

 速度パラメータ設定の応用として、慣性のつく設定を紹介します。
 以下のように、最大の速さ以外のパラメータの値を大きく下げ、また加速より減速の値を低くします。

f:id:katze_7514:20161026180052p:plain

 すると次の動画のようになります。

youtu.be

移動制限パラメータ

 移動する平面を指定することができます。指定した平面以外へは動かなくなります。
 詳細パネルのPlanarMovementで設定します。
 
f:id:katze_7514:20161026154839p:plain

 図の設定だと、移動がXY平面のみとなりZ方向には動かなくなります。

パラメータ 意味
Constrain to Plane チェックを入れると平面に移動が制限される
Snap to Plane at Start Spawnした時から指定した平面に制限するか
Plane Constraint Axis Setting 移動制限したい平面の簡易設定。移動制限する平面の法線軸を指定。Customを選んだ場合は次の2項目を自分でいれる
Plane Constraint Normal 移動制限平面との法線ベクトル
Plane Constraint Origin 移動制限平面の法線ベクトルの原点

 ただし、Pawnに直接Locationを入れれば(AddWorldLocationなど)、動かない方向にも動きます。あくまで、FloatingPawnMovementによる移動が制限される設定となります。

Navigation

 FloatingPawnMovementは、Navigation移動に対応しています。AIControllerを持つPawnに持たせれば、MoveTo系ノードを使うことで、今まで紹介したパラメータに従ってNavigationします。

注意点

 FloatingPawnMovementは、AddInputVectorでベクトルが追加されなかった場合に減速する仕組み上、前フレームとの位置差分を速度ベクトルに変換する処理が入っています。
 そのため、直接Locationを入れて動かすことと併用している場合、想定してない移動になることがまれにあります。

 自分の場合は、移動制限せずに、描画順制御のためにZ方向の移動だけはSetWorldLocationで行っていた所、Z方向に速度が発生してしまいました。描画順がおかしくなったり、衝突するはずのコリジョンが当たらなくなったりしていました。