Unreal EngineにおけるアクタをSplineの軌跡に沿って移動させる方法 ~前編~

 本投稿は,Unreal Engine(UE)におけるアクタに対し,Splineによって描いた軌跡に沿って移動させる方法に関する投稿です.そして前編と後編すべてを合わせたゴールとして,構造体型の配列で管理する複数のアクタをSpilneの軌跡に沿って移動させる方法を説明します.
 前編の内容は,Splineの準備や,Splineに沿ってアクタを移動させる仕組みの概念についての説明です(図1).基本として末尾に記載する参照サイト[1]と内容の多くは重複していますが,筆者自身の手元に情報を記録し残しておくことを目的とした備忘録になります.また,筆者自身が実装していた中で知った,参照サイト[1]には無い情報を補完する内容になります.
 使用しているUEのバージョンは4.25.4です.

図1 前編の結果

目次

  1. Splineで移動させる仕組みの概念
  2. 実装手法
    参考

1. Splineで移動させる仕組みの概念

 この第1章では,次章で実際に実装してゆく仕組みの概念を説明します(図2).
 実際に実装するものは,2つのBlueprint(BP)クラスのみです.1つは移動させたいアクタ(キャラクタなど.本投稿では立方体のメッシュを扱います).もう1つはSplineの軌跡を持つアクタです.
 そして,移動させたいアクタに,Splineの軌跡を持つアクタ型の変数を内包させます.

図2 本投稿で実装する仕組みの概念

2. 実装手法

 Spline用BPクラス「BP_Spline」の作成

 Splineの軌跡を持たせるBP_Splineを作成します.まずはコンテンツブラウザ上で右クリックし,アクタ型のBPを作成します.そして作成したBP_Splineクラスに対しこれからBPを編集してゆきます.
 コンポーネントにSplineを追加します.追加方法は「BP_Splineクラス>『コンポーネント』タブ>コンポーネントを追加>Spiline」です(図3).これによって,このBP_Splineクラスをレベル上に配置しオブジェクト化した際に,Splineの軌跡を引くことができると共に,BP上でノードとして扱うこともできます.
 

図3 コンポーネントにSpilineを追加

 BP_Splineに設けるクラス変数と関数は,表1の通りです.そしてGetCurrentLocation関数と,GetCurrentRotation関数のBPの様子を,それぞれ図4と図5に示します.
  GetCurrentLocation関数のboolean型の引数loopを設けています.trueの場合は,Splineの終端まで移動した後,始端に戻り,繰り返し移動し続けます.

表1 BP_Splineのクラス変数/関数と各内容
変数/関数名 内容
localDistance変数 float型のクラス変数.GetCurrentLocation関数およびGetCurrentRotation関数にて,現在位置と向きを導出するために使用
GetCurrentLocation関数 Spineの長さに対する現在進んだ距離(float値)に対し,ワールド座標系でのその位置(vector値)を返す
GetCurrentRotation関数  Spineの長さに対する現在進んだ距離(float値)に対し,ワールド座標系でのその位置における向き(rotator値)を返す
図4 GetCurrentLocation関数
図5 GetCurrentRotation関数

 Splineの軌跡の作成

 作成したBP_Splineクラスをレベル上に配置しオブジェクト化します(図6).BP_Splineオブジェクトを選択すると,白い線とスプラインポイントが表示されます.そしてスプラインポイントを選択すると,オレンジ色でタンジェントが表示されます.タンジェントを移動させると,そのポイントへ至る軌跡の曲がり具合と,そのポイントから発する軌跡の曲がり具合を変えられます.
 スプラインポイントを選択した状態で,altキーを押しながらドラッグすると,次のスプラインポイントを追加できます.

図6 Splineの軌跡を描く様子

 スプラインポイントとタンジェントをマニピュレータではなく数値で設定する方法を説明します.BP_Splineオブジェクトで編集したいスプラインポイントを選択します.そして「詳細タブ>コンポーネント>Spline」を選択します.これより詳細タブ内に「Selected Points」の項目が表示されます(図7).
 Selected Pointsにおける各項目にて,主なものを説明します(表2).その他の詳細も知りたい場合は,公式によるUEドキュメント[2]を参照されたし.

図7 スプラインポイントを数値的に設定
表2 Selected Pointsの各項目
変数/関数名 内容
位置 スプラインポイントのLocation.ローカル座標系のため,オブジェクトの座標を原点(0, 0, 0)とした位置
到達タンジェント 選択しているスプラインポイントに至るタンジェントの位置
接線を残す 選択しているスプラインポイントから発するタンジェントの位置

 移動させるアクタ用BPクラス「BP_MoveCube」の作成

 Splineの軌跡に沿って移動させるBP_MoveCUbeを作成します.まずはコンテンツブラウザ上で右クリックし,アクタ型のBPを作成します.そして作成したBP _MoveCUbe クラスに対しこれからBPを編集してゆきます.
 BP_Splineに設けるクラス変数は,表3の通りです.また,Spline変数のパブリック化について図8に示します.そしてイベントグラフの様子を図9に示します.

表3 BP_MoveCubeのクラス変数と内容
変数名 内容
spline変数 BP_Spline型のクラス変数.「マイブループリント」タブ上で目のマークをONにし,パブリック変数化します(図8).これによってレベルに配置しオブジェクト化した後に,詳細タブから代入する値を設定できます(後述します)
moveDistance変数 float型のクラス変数.オブジェクトした際に,そのオブジェクトの移動量を表します(Spline上の始端のとき0となり,終端で最大値)
speed変数 float型のクラス変数.移動する速さを表します.本投稿ではプレイ中にspeedの値を更新する仕組みはないため,デフォルト値で0より大きな値を代入してください(0だと停止したまま移動しません.筆者は喩えとして100にしました)
図8 BP_MoveCubeクラスのクラス変数とspline変数のパブリック化
図9 BP_MoveCubeクラスのイベントグラフ

 プレイしている最中に移動している様子を確認するためには,外観となるメッシュが必要になります.BP_MoveCubeクラスの「詳細 タブ>コンポーネント タブ>コンポーネントを追加」でStaticMeshを追加します.そして追加したStaticMeshを選択した状態でスタティックメッシュを設定します(図10).
 ここで設定するスタティックメッシュは,適宜用意してください.筆者はBlenderで作成したただの立方体をfbx形式でエクスポートしたものを,UEにインポートしました.

図10 スタティックメッシュ コンポーネントの追加とスタティックメッシュの設定

 最後に, BP_MoveCubeオブジェクトし,Spline変数に,則して移動させたい軌跡を設定します.
 まず,作成したBP_MoveCubeクラスをレベル上にドラッグ&ドロップしてオブジェクト化します.このBP_MoveCubeオブジェクトのLocationの値はいずれでもかまいません.プレイ中は,オブジェクトのLocationはSplineの軌跡上へと書き換えられるためです.
 そして,そのオブジェクトを選択した状態で「詳細 タブ>デフォルト>Spline」にて,即して移動させたい軌跡のSplineを設定します(図11).最後にオブジェクト化してあるBP_Splineオブジェクトを代入します.
 本投稿では,オブジェクト化してあるSplineは BP_Splineオブジェクトの1つだけですが,他にもあれば,この設定項目でSplineを切り替えるだけで, BP_MoveCubeオブジェクトを則して移動させたい軌跡を変更できます.

図11 BP_MoveCubeオブジェクトのSpline変数への値の代入

参考

  1. 株式会社ヒストリア, [UE4] スプライン上を動く足場の作り方, https://historia.co.jp/archives/1232/, (参照 2021-11-27).
  2. Epic Games, Inc., Unreal Engine 4ドキュメント Blueprint Spline コンポーネントのプロパティ リファレンス, https://docs.unrealengine.com/4.27/ja/BuildingWorlds/BlueprintSplines/Reference/ComponentProperties/, (参照 2021-11-27).