BLOGブログ

2016.02.24UE4UE/ Blueprint

[UE4] スプライン移動するキャラクターを作る

改訂バージョン: Unreal Engine 4.21

以前、スプラインの移動処理をコンポーネント化する方法をご紹介しましたが、今回はそのスプライン移動の機能を更に充実化させ、キャラクターを移動させる方法の一つをご紹介したいと思います。

 

ちなみに実装後の動画がこちらになります。

 

さて、前回までの機能は、移動処理にSetActorLocationAndRotationを使用していたため、キャラクターに使うには色々と問題がありました。例えば、スプラインを地面に添って設置しなければキャラクターが地面に浮いてしまったり、埋もれたりしてしまうからです。接地処理に関しては、キャラクターの足元からレイを飛ばして地面の座標を取得する方法などが考えられますが、毎フレームやるには処理が重いためあまり良い方法でありません。
そこでSetActorLocationAndRotationを使わず、移動処理のみをカスタマイズした新しいスプライン移動用のコンポーネントを作成したいと思います。

まずは準備として以前作成したコンポーネントに若干修正を加えます。
以前はTick内でForceMove関数を使用して移動させていましたが、強制移動とは別に通常移動用の処理を用意して、こちらを使うことにします。
そこで、新しく用意する通常移動処理の関数名をMovingProcessとします。

Functions

関数名 Description
MovingProcess 現在の移動量から通常の移動

MovingProcess関数

関数の中身は以前のForceMove関数と同じ処理を書きます。ただし、前回の移動関数には戻り値がありませんでしたが、今回はResultというBool型の戻り値を関数に追加します。これはこの後作る派生クラスで、移動関数をオーバーライド出来るようにするためです。

1

 

通常移動処理用の関数を用意したら、Tick内はこちらを使用するように差し替えます。

Event Tick

2

 

次に、スプラインを設定する関数であるSetSpline関数に機能を追加します。

SetSpline関数

引数に移動速度と、開始時にスプラインの始端へ強制移動するかのフラグを追加します。強制移動を行う際は、もちろんForceMove関数の方を使用します。

3

 

では早速新しくキャラクター用のスプライン移動コンポーネントを作成します。
まず、既存のスプライン移動コンポーネントを基底にした新しいコンポーネントを作成します。名前はとりあえずSplineCharacterMoveComponentとします。

4

次に基底クラス内の関数、MovingProcess関数をオーバーライドして関数を書き換えます。
この時、基底クラス側の関数に引数がないとオーバーライドした際に自動でイベント扱いとなるので注意して下さい。

5

6

使用したのはPawnのAddMovementInputです。Pawnの関数なので、オーナーをPawn型にキャストしています。
コンポーネントはどのブループリントクラスでも使用できるため、オーナーが必ずコンポーネント作成者の意図した型にならない事は注意して下さい。

あとは実際にスプラインアクターをレベルに配置し、SplineCharacterMoveComponentを追加することで、スプラインに沿って移動できるようになります。

これでキャラクター用の移動用スプラインコンポーネントは完成しました。

 

今までは移動処理の中身でスプラインの座標を直接取得していましたが、今回はスプラインの向き情報を利用してAddMovementInputでキャラクターを動かしています。ですので、移動速度に実際のキャラクターの移動速度を渡しておかないと、スプラインと実際の移動座標がずれてしまうのにご注意下さい。
また、開始時に強制移動を行っている理由も同じです。開始位置がスプラインの始端になっていないと、スプライン通りに移動する事ができないためです。通常移動と強制移動で処理を分けたのはこのためでした。

 

このようにやや癖はありますが、スプラインの向きのみを参照してキャラクターを動かしているので、凹凸の地面でも気にせずスプラインを引くことができます。わざわざ凹凸に合わせてスプラインを配置しなくても、キャラクターは勝手に凹凸に合わせて走ってくれるでしょう。
また、移動の処理自体はキャラクターのCharacterMovementの機能を使って動いているため、例えばOrientRotationtoMovementにチェックマークを入れれば、キャラクターは移動方向に合わせてそちらを向く事が可能です。

8

このように利点は大きいですが、やはりスプラインの座標を参照しているわけではないので、どうしても厳密にスプラインをなぞる事は難しいです。ですので、より正確にスプライン移動をしたい場合は、MovingProcessを自由にカスタマイズしてより正確なものを目指しましょう。