BLOGブログ

2015.04.15UE4UE/ Blueprint

[UE4] スプライン移動をコンポーネント化する

執筆バージョン: Unreal Engine 4.7
改訂バージョン: Unreal Engine 4.19

以前、「SplineComponent」を使用して、動く足場の作り方を紹介しました。
今回はそれを応用し、UE4.7から実装されたコンポーネントのブループリントを作成できる機能を使用し、スプライン移動用のコンポーネントの作り方をご紹介します。

 

コンポーネントにするメリット

以前は、レベルに配置するスプラインのアクター「MySplineActor」と、それを参照して移動するアクター「Scaffold」の2種類を作成しました。
しかしこの方法では、移動するアクターを作るたびにスプライン移動する機能を基底クラスに持つ必要がありました。
そこでUE4.7の新機能であるコンポーネントのブループリント化を利用すれば、簡単にアクターをスプライン移動させることが出来るようになる他、既にレベル上に配置した特定のアクターに対しても簡単にスプライン移動させる事ができるようになります。

 

MySplineActorの改良

スプライン用のアクターである「MySplineActor」は以前作成したものをそのまま利用できますが、今回の使用にあたり、少し改造しました。

GetCurrentLocationAndRotation関数

GetCurrentLocation関数を改良し、向きと回転情報も同時に取得するようにしました。関数名も機能を追加した事で変更しました。

その他

以前はとくにそのままでしたが、値を取得するだけのIsArrived関数やGet系関数は純粋関数に変更しました。
また、自作していたGetSplineLengthは特に拡張の必要性を感じなかったので削除しました。

 

SplineMoveComponentの作成

コンテンツブラウザで右クリックをし、「CreateBasicAsset」から「Blueprint Class」を選択、「Actor Component」を選んで名前を「SplineMoveComponent」とします。
この後は通常のクラスブループリントとほぼ同じです。せっかくなので、前回より色々な機能を追加したいと思います

 

新機能の仕様

・何も指定しないとスプラインの終端まで移動した後止まる
・LoopをTrueにするとスプラインの終端まで移動したら始端へワープする
・ReturnをTrueにするとスプラインの終端まで移動したら始端に向かう。始端に戻ったら止まる
・ReturnとLoopをTrueにするとスプラインの終端と始端を行ったり来たりする
・Pause関数を呼び出すと一時停止する。
・AddMoveDistance関数で現在の位置から指定の移動量分進む、もしくはマイナス値で戻る
・SetMoveDistance関数で任意の移動量を指定する
・ForceMove関数で強制移動する。SetMoveDistance関数やAddMoveDistance関数と組み合わせることで任意の位置にワープする

 

Variables

VariableName VariableType Instance Editable Tooltip Private
Spline MySplineActorの参照型 True 参照用スプライン False
Speed Float True 移動速度 False
MoveDistance Float False 現在の移動量 True
Loop Boolean True True:スプラインの末端に到達したらループする False
Return Boolean True True:スプラインの末端に到達したら始端へ向かう False
Reverse Boolean False 逆再生中かどうか True

Functions

関数名 Description
SetSpline関数 スプラインのセット
IsArrived関数 到着したかどうか
GetSplineLength関数 スプラインの長さを取得
SetMoveDistance関数 移動量を指定
AddMoveDistance関数 移動量を追加
ForceMove関数 現在の移動量から強制移動
Pause関数 一時停止

SetSpline関数

参照するスプラインをセットし、移動量を初期化します

12

 

IsArrived関数

逆再生機能に対応するため、始端と終端の両方で到着したかの判定を返すようにします

02

 

GetSplineLength関数

以前とほぼ一緒です

 

SetMoveDistance関数

移動量をセットしていますが、場合によってForceMove関数を呼び出して強制移動までセットにするとよいかもしれません。

 03

 

AddMoveDistance関数

内部でSetMoveDistance関数を呼び出しているので、SetMoveDistance関数の仕様を変更するとその影響を受けます。

04

 

ForceMove関数

コンポーネントの持ち主であるオーナーのアクターの座標を変更します。今回は回転情報も使用するようにしました。また、スプラインのループ指定は戻る設定の際は使用しないので注意が必要です。

05

Pause関数

今回移動の停止はTickのEnabledを切り替えることで実現することにしました。booleanを使って「Event Tick」の最初に分岐する方法でも問題ありません。

06

 

Event Tick

毎フレームの移動量を算出し、オーナーのアクターを移動させます。Loop設定やReturn設定によって始端もしくは終端到着後にそれぞれ専用の処理を行います。

07 08

 

適用方法

自分で作成したコンポーネントは、既存のコンポーネントと同様にクラスブループリントの「AddComponent」から追加できます。

09

 

またUE4.7から、新たにレベルに配置している特定のアクターにのみ追加することも可能になりました。

10

11

 

これでスプラインを使って色んなアクター(スタティックメッシュやカメラ、キャラクターなど)が移動できるようになりました。まだまだ改良の余地はあると思いますので、色々と自分なりに改造してみましょう。