執筆バージョン: Unreal Engine 4.7
改訂バージョン: Unreal Engine 4.19 |
以前、「SplineComponent」を使用して、動く足場の作り方を紹介しました。
今回はそれを応用し、UE4.7から実装されたコンポーネントのブループリントを作成できる機能を使用し、スプライン移動用のコンポーネントの作り方をご紹介します。
コンポーネントにするメリット
以前は、レベルに配置するスプラインのアクター「MySplineActor」と、それを参照して移動するアクター「Scaffold」の2種類を作成しました。
しかしこの方法では、移動するアクターを作るたびにスプライン移動する機能を基底クラスに持つ必要がありました。
そこでUE4.7の新機能であるコンポーネントのブループリント化を利用すれば、簡単にアクターをスプライン移動させることが出来るようになる他、既にレベル上に配置した特定のアクターに対しても簡単にスプライン移動させる事ができるようになります。
MySplineActorの改良
スプライン用のアクターである「MySplineActor」は以前作成したものをそのまま利用できますが、今回の使用にあたり、少し改造しました。
GetCurrentLocationAndRotation関数
GetCurrentLocation関数を改良し、向きと回転情報も同時に取得するようにしました。関数名も機能を追加した事で変更しました。
![](https://historia.co.jp/wp/wp-content/uploads/2015/04/01-1.png)
その他
以前はとくにそのままでしたが、値を取得するだけの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](https://historia.co.jp/wp/wp-content/uploads/2015/04/12-300x83.png)
IsArrived関数
逆再生機能に対応するため、始端と終端の両方で到着したかの判定を返すようにします
![02](https://historia.co.jp/wp/wp-content/uploads/2015/04/02-300x176.png)
GetSplineLength関数
以前とほぼ一緒です
SetMoveDistance関数
移動量をセットしていますが、場合によってForceMove関数を呼び出して強制移動までセットにするとよいかもしれません。
![03](https://historia.co.jp/wp/wp-content/uploads/2015/04/03-300x99.png)
AddMoveDistance関数
内部でSetMoveDistance関数を呼び出しているので、SetMoveDistance関数の仕様を変更するとその影響を受けます。
![04](https://historia.co.jp/wp/wp-content/uploads/2015/04/04-300x117.png)
ForceMove関数
コンポーネントの持ち主であるオーナーのアクターの座標を変更します。今回は回転情報も使用するようにしました。また、スプラインのループ指定は戻る設定の際は使用しないので注意が必要です。
![05](https://historia.co.jp/wp/wp-content/uploads/2015/04/05-300x135.png)
Pause関数
今回移動の停止はTickのEnabledを切り替えることで実現することにしました。booleanを使って「Event Tick」の最初に分岐する方法でも問題ありません。
![06](https://historia.co.jp/wp/wp-content/uploads/2015/04/06-300x142.png)
Event Tick
毎フレームの移動量を算出し、オーナーのアクターを移動させます。Loop設定やReturn設定によって始端もしくは終端到着後にそれぞれ専用の処理を行います。
![08](https://historia.co.jp/wp/wp-content/uploads/2015/04/08-300x197.png)
適用方法
自分で作成したコンポーネントは、既存のコンポーネントと同様にクラスブループリントの「AddComponent」から追加できます。
![09](https://historia.co.jp/wp/wp-content/uploads/2015/04/09-163x300.png)
またUE4.7から、新たにレベルに配置している特定のアクターにのみ追加することも可能になりました。
![10](https://historia.co.jp/wp/wp-content/uploads/2015/04/10-300x160.png)
![11](https://historia.co.jp/wp/wp-content/uploads/2015/04/11-300x297.png)
これでスプラインを使って色んなアクター(スタティックメッシュやカメラ、キャラクターなど)が移動できるようになりました。まだまだ改良の余地はあると思いますので、色々と自分なりに改造してみましょう。