Unreal EngineにおけるアクタをSplineの軌跡に沿って移動させる方法 ~前編~
本投稿は,Unreal Engine(UE)におけるアクタに対し,Splineによって描いた軌跡に沿って移動させる方法に関する投稿です.そして前編と後編すべてを合わせたゴールとして,構造体型の配列で管理する複数のアクタをSpilneの軌跡に沿って移動させる方法を説明します.
前編の内容は,Splineの準備や,Splineに沿ってアクタを移動させる仕組みの概念についての説明です(図1).基本として末尾に記載する参照サイト[1]と内容の多くは重複していますが,筆者自身の手元に情報を記録し残しておくことを目的とした備忘録になります.また,筆者自身が実装していた中で知った,参照サイト[1]には無い情報を補完する内容になります.
使用しているUEのバージョンは4.25.4です.
目次
1. Splineで移動させる仕組みの概念
この第1章では,次章で実際に実装してゆく仕組みの概念を説明します(図2).
実際に実装するものは,2つのBlueprint(BP)クラスのみです.1つは移動させたいアクタ(キャラクタなど.本投稿では立方体のメッシュを扱います).もう1つはSplineの軌跡を持つアクタです.
そして,移動させたいアクタに,Splineの軌跡を持つアクタ型の変数を内包させます.
2. 実装手法
Spline用BPクラス「BP_Spline」の作成
Splineの軌跡を持たせるBP_Splineを作成します.まずはコンテンツブラウザ上で右クリックし,アクタ型のBPを作成します.そして作成したBP_Splineクラスに対しこれからBPを編集してゆきます.
コンポーネントにSplineを追加します.追加方法は「BP_Splineクラス>『コンポーネント』タブ>コンポーネントを追加>Spiline」です(図3).これによって,このBP_Splineクラスをレベル上に配置しオブジェクト化した際に,Splineの軌跡を引くことができると共に,BP上でノードとして扱うこともできます.
BP_Splineに設けるクラス変数と関数は,表1の通りです.そしてGetCurrentLocation関数と,GetCurrentRotation関数のBPの様子を,それぞれ図4と図5に示します.
GetCurrentLocation関数のboolean型の引数loopを設けています.trueの場合は,Splineの終端まで移動した後,始端に戻り,繰り返し移動し続けます.
変数/関数名 | 内容 |
localDistance変数 | float型のクラス変数.GetCurrentLocation関数およびGetCurrentRotation関数にて,現在位置と向きを導出するために使用 |
GetCurrentLocation関数 | Spineの長さに対する現在進んだ距離(float値)に対し,ワールド座標系でのその位置(vector値)を返す |
GetCurrentRotation関数 | Spineの長さに対する現在進んだ距離(float値)に対し,ワールド座標系でのその位置における向き(rotator値)を返す |
Splineの軌跡の作成
作成したBP_Splineクラスをレベル上に配置しオブジェクト化します(図6).BP_Splineオブジェクトを選択すると,白い線とスプラインポイントが表示されます.そしてスプラインポイントを選択すると,オレンジ色でタンジェントが表示されます.タンジェントを移動させると,そのポイントへ至る軌跡の曲がり具合と,そのポイントから発する軌跡の曲がり具合を変えられます.
スプラインポイントを選択した状態で,altキーを押しながらドラッグすると,次のスプラインポイントを追加できます.
スプラインポイントとタンジェントをマニピュレータではなく数値で設定する方法を説明します.BP_Splineオブジェクトで編集したいスプラインポイントを選択します.そして「詳細タブ>コンポーネント>Spline」を選択します.これより詳細タブ内に「Selected Points」の項目が表示されます(図7).
Selected Pointsにおける各項目にて,主なものを説明します(表2).その他の詳細も知りたい場合は,公式によるUEドキュメント[2]を参照されたし.
変数/関数名 | 内容 |
位置 | スプラインポイントのLocation.ローカル座標系のため,オブジェクトの座標を原点(0, 0, 0)とした位置 |
到達タンジェント | 選択しているスプラインポイントに至るタンジェントの位置 |
接線を残す | 選択しているスプラインポイントから発するタンジェントの位置 |
移動させるアクタ用BPクラス「BP_MoveCube」の作成
Splineの軌跡に沿って移動させるBP_MoveCUbeを作成します.まずはコンテンツブラウザ上で右クリックし,アクタ型のBPを作成します.そして作成したBP _MoveCUbe クラスに対しこれからBPを編集してゆきます.
BP_Splineに設けるクラス変数は,表3の通りです.また,Spline変数のパブリック化について図8に示します.そしてイベントグラフの様子を図9に示します.
変数名 | 内容 |
spline変数 | BP_Spline型のクラス変数.「マイブループリント」タブ上で目のマークをONにし,パブリック変数化します(図8).これによってレベルに配置しオブジェクト化した後に,詳細タブから代入する値を設定できます(後述します) |
moveDistance変数 | float型のクラス変数.オブジェクトした際に,そのオブジェクトの移動量を表します(Spline上の始端のとき0となり,終端で最大値) |
speed変数 | float型のクラス変数.移動する速さを表します.本投稿ではプレイ中にspeedの値を更新する仕組みはないため,デフォルト値で0より大きな値を代入してください(0だと停止したまま移動しません.筆者は喩えとして100にしました) |
プレイしている最中に移動している様子を確認するためには,外観となるメッシュが必要になります.BP_MoveCubeクラスの「詳細 タブ>コンポーネント タブ>コンポーネントを追加」でStaticMeshを追加します.そして追加したStaticMeshを選択した状態でスタティックメッシュを設定します(図10).
ここで設定するスタティックメッシュは,適宜用意してください.筆者はBlenderで作成したただの立方体をfbx形式でエクスポートしたものを,UEにインポートしました.
最後に, BP_MoveCubeオブジェクトし,Spline変数に,則して移動させたい軌跡を設定します.
まず,作成したBP_MoveCubeクラスをレベル上にドラッグ&ドロップしてオブジェクト化します.このBP_MoveCubeオブジェクトのLocationの値はいずれでもかまいません.プレイ中は,オブジェクトのLocationはSplineの軌跡上へと書き換えられるためです.
そして,そのオブジェクトを選択した状態で「詳細 タブ>デフォルト>Spline」にて,即して移動させたい軌跡のSplineを設定します(図11).最後にオブジェクト化してあるBP_Splineオブジェクトを代入します.
本投稿では,オブジェクト化してあるSplineは BP_Splineオブジェクトの1つだけですが,他にもあれば,この設定項目でSplineを切り替えるだけで, BP_MoveCubeオブジェクトを則して移動させたい軌跡を変更できます.