1.

UE5でFloatingPawnMovementの上下移動を制限する方法|Plane Constraint活用

編集

UE5でFloatingPawnMovementを使いながら上下(Z軸)方向の移動を制限する最も確実な方法は、Plane Constraint(平面拘束)を有効化し、拘束平面の法線を上方向(0,0,1)に設定して、Pawnの動きをXY平面上に固定することです。

FloatingPawnMovementは、重力の影響を受けずに任意の方向へ自由に浮遊移動できるコンポーネントで、デフォルトでは前後・左右だけでなく上下方向にも移動できます。地面を走るキャラクターや一定高度を保つ乗り物のように、Z軸の動きだけを止めたい場面では、入力側とコンポーネント側の両方を見直す必要があります。本記事では、代表的な3つの方法と、それぞれの選び方・落とし穴を整理します。

この記事の要点
  • FloatingPawnMovementは重力なしで全方向へ浮遊移動するため、上下移動は「与えられた入力」と「コンポーネントの拘束設定」の両面から制限する。
  • 方法①:移動入力(Add Movement Input)のベクトルからZ成分を取り除き、そもそも上下方向の入力を与えない。
  • 方法②:移動処理後にSet Actor LocationでZ座標を一定値へ固定、またはClampで範囲内に収める。
  • 方法③:Plane Constraint(Constrain to Plane)を有効化し、Set Plane Constraint Normalで法線を(0,0,1)にしてXY平面へ拘束する。
  • 入力側だけ、コンポーネント側だけを直すと取りこぼしが起きやすいため、用途に応じて組み合わせるのが安全。

FloatingPawnMovementが上下に動く理由

FloatingPawnMovementは、Pawnに対してシンプルな移動を提供する移動コンポーネントです。速度や加速度の上限は持ちますが、重力は実装されていません。そのため、何も入力しなければその場に留まり、入力された方向にはZ軸を含め自由に移動します。

移動は通常、Add Movement Inputノードに渡された方向ベクトルにもとづいて処理されます。このベクトルにZ成分が含まれていれば、コンポーネントはその分だけ上下に動こうとします。つまり「勝手に落ちる」のではなく「与えた入力やジャンプ系処理に応じて上下する」という性質です。上下移動を止めるには、この入力の流れと、コンポーネント自身が持つ拘束機能の両方を意識します。

方法①:移動入力からZ成分を取り除く

最も理解しやすいのは、移動入力を作る段階でZ成分を0にしてしまう方法です。前後・左右の入力からベクトルを組み立てるとき、Z軸の値を加えなければ、コンポーネントへ上下方向の指示が渡らなくなります。

典型的な流れは次のとおりです。

1. 移動入力イベント(例:移動軸の入力やEvent Tick)で、進みたい方向ベクトルを計算する。

2. そのベクトルのZ成分を0に置き換える(Break/Make Vectorで分解・再構成するか、X・Yのみを使う)。

3. Z成分を除いたベクトルをAdd Movement Inputへ渡す。

// 擬似コード(移動入力からZを除去)

Direction = (InputX, InputY, InputZ)

Direction.Z = 0  // 上下方向の入力を捨てる

AddMovementInput(Direction)

この方法は、純粋に「上下方向の入力を出さない」だけなので副作用が少なく、地面に沿って移動するキャラクターの基本対策として向いています。視点に応じてカメラの前方ベクトルから移動方向を作る場合も、その前方ベクトルのZを0にしてから正規化し直すと、見上げ・見下ろし時に意図せず上下へ進むのを防げます。ただし、ジャンプ処理やノックバック、別ノードからのSet Actor Locationなど、入力以外の経路でZが変化する場合はこれだけでは防げません。上下移動が残るときは、まずZを動かしている処理がどこにあるかを切り分けることが解決の近道です。

方法②:移動後にZ座標を固定・クランプする

すでにある移動ロジックに手を入れず、結果としての高さだけを揃えたい場合は、毎フレーム移動が終わった後にアクターのZ座標を上書きする方法が使えます。

1. Event Tickなどで、移動処理が行われた後の現在位置(Get Actor Location)を取得する。

2. 取得した位置のZ値を、維持したい高さ(初期Zや目標高度)に置き換える。

3. 書き換えた位置をSet Actor Locationで適用する。X・Yはそのまま、Zだけを固定する。

高さを完全に一定値へ張り付けるのではなく、上限・下限のある範囲に収めたいときは、Z値をClamp(最小値と最大値で挟む)してから適用します。これにより「ある高度より上には行かせない/下には行かせない」といった制御ができます。

// 擬似コード(移動後にZを固定 or クランプ)

Loc = GetActorLocation()

Loc.Z = FixedHeight  // 一定値に固定する場合

// Loc.Z = Clamp(Loc.Z, MinZ, MaxZ)  // 範囲内に収める場合

SetActorLocation(Loc)

この方法は入力経路を問わず最終的な高さを揃えられる強みがありますが、移動を後から上書きするため、他の物理的な挙動や補間と組み合わせると不自然な見えになることがあります。Set Actor Location実行時のSweep(衝突判定)設定によって、壁や床への押し戻し挙動も変わる点に注意してください。

方法③:Plane Constraint(平面拘束)でXY平面に固定する

FloatingPawnMovementを含む移動コンポーネントには、移動を1つの平面に拘束するPlane Constraint機能が備わっています。これを使うと、コンポーネント自身のレベルで上下移動を抑えられます。

設定の考え方は「拘束したい平面の法線(normal)を指定する」というものです。上下方向の移動を止めたい=XY平面に拘束したい場合、その平面に垂直な方向であるZ軸、すなわち法線を(0,0,1)に設定します。公式ドキュメントでも、Y方向を固定してX-Z平面に拘束したい場合は法線を(0,1,0)にする、と説明されており、同じ要領でZ方向を固定するには法線を(0,0,1)にします。

主な設定項目は次のとおりです。

- Constrain to Plane(bConstrainToPlane):trueにすると平面拘束が有効になる。

- Plane Constraint Normal:拘束平面の法線。Z固定なら(0,0,1)。Set Plane Constraint Normalノードで実行時に設定でき、法線を変更すると軸設定(PlaneConstraintAxisSetting)は自動的にCustomになる。

- Plane Constraint Origin:拘束平面の原点。どの高さの平面に固定するかを決め、スナップ時の基準になる。

- Snap to Plane at Start(bSnapToPlaneAtStart):trueにすると、開始時に対象コンポーネントが拘束平面へスナップされる。

実行時にコードやブループリントから設定する場合は、Constrain to Planeを有効化したうえでSet Plane Constraint Normalに(0,0,1)を渡します。すでにずれている位置を平面へ合わせ込みたいときは、Snap Updated Component to Planeを呼ぶか、開始時スナップを有効にしておきます。エディタ上の詳細パネルでも、Planar Movementのカテゴリから同じ項目を設定できます。法線にはX/Y/Zの定番方向のほか任意のベクトルを指定でき、斜めの平面に拘束することも可能ですが、単純に上下だけを止めたい用途では(0,0,1)で十分です。

// 擬似コード(実行時にXY平面へ拘束)

Movement->SetPlaneConstraintEnabled(true)

Movement->SetPlaneConstraintNormal( (0,0,1) )

Movement->SnapUpdatedComponentToPlane()  // 必要に応じて平面へ合わせる

3つの方法の比較

方法仕組み向いている用途注意点
①入力のZを0にするAdd Movement Inputへ渡すベクトルからZ成分を除く地面に沿って移動する基本的なPawn入力以外の経路で動くZには無効
②Set Actor LocationでZ固定/クランプ移動後にZ座標を上書き、または範囲内に収める一定高度の維持、上下の可動範囲制限後から上書きするため他挙動と競合しやすい
③Plane Constraint法線(0,0,1)の平面に移動を拘束コンポーネントレベルで恒久的にZを止めたい有効化・法線・原点の設定漏れに注意

具体例:地面を移動するキャラクター

例として、見下ろし視点で地面を移動するキャラクターのZ移動を止める場合を考えます。シンプルかつ堅牢にするなら、入力側とコンポーネント側を組み合わせます。

1. 移動入力を作る段階でZ成分を0にし、上下方向の入力をそもそも出さない(方法①)。

2. FloatingPawnMovementのConstrain to Planeを有効化し、Plane Constraint Normalを(0,0,1)に設定する(方法③)。

3. 開始位置がずれないよう、Snap to Plane at Startを有効にするか、開始時にSnap Updated Component to Planeを呼ぶ。

これにより、入力で上下を出さないうえに、万一どこかでZ方向の力が加わっても平面拘束が効くため、二重に上下移動を抑えられます。さらに厳密な高度範囲が必要なら、方法②のClampを補助的に追加します。

落とし穴と注意点

落とし穴内容と対策
入力側だけ直して安心する入力のZを0にしても、別のノードやSet Actor Location、外力でZが動くことがある。コンポーネント側の平面拘束も併用すると取りこぼしを防ぎやすい。
重力で落ちると誤解するFloatingPawnMovementは重力を実装していない。上下移動の原因は与えた入力や処理側にあるため、まずZ入力の出所を確認する。
Plane Constraintの法線を取り違える固定したい軸の方向をそのまま法線に入れる。Z(上下)を止めたいなら法線は(0,0,1)。X-Z平面に拘束(Y固定)なら(0,1,0)。意図と逆の平面に拘束しないよう確認する。
Constrain to Planeを有効にし忘れる法線だけ設定してもConstrain to Plane(bConstrainToPlane)がオフだと拘束は効かない。有効化とセットで設定する。
開始位置のずれを放置する拘束平面と初期位置がずれていると見た目が不自然になることがある。Snap to Plane at StartやSnap Updated Component to Planeで合わせる。

よくある質問

Q. 法線は必ず(0,0,1)に正規化して入れる必要がありますか?

A. 平面拘束の法線は、コンポーネントがワールドへ登録される際に正規化されます。(0,0,1)はすでに単位ベクトルなのでそのまま使えますが、向き(どの軸を止めるか)が正しいかを優先して確認してください。

Q. Plane Constraintを使えば入力のZ処理は不要ですか?

A. 平面拘束はコンポーネントの移動を平面へ収めますが、ゲーム側のロジックを単純に保つ意味でも、上下に動かす必要がない入力は最初からZを0にしておくのが無難です。両方を併用すると、設定漏れや別経路の動きに対して堅牢になります。挙動の細部はプロジェクトのバージョンや構成で異なる場合があるため、最終的な仕様はエンジン同梱のドキュメントや実機での確認を推奨します。

Q. 一定の高さに保ちたいだけなら、どの方法が手軽ですか?

A. 既存の移動ロジックに触れずに高さだけ揃えたい場合は、方法②のSet Actor LocationでZを固定するのが手軽です。恒久的にXY平面へ固定したい場合は方法③のPlane Constraintが適しています。用途に応じて選び、必要なら組み合わせてください。

編集
Post Share
子ページ

子ページはありません

同階層のページ

同階層のページはありません