🙄

【UE4】Splineを使ってPlayerを強制的に歩かせる。

2022/03/27に公開

SplineとTimelineを使ってPlayerを強制的に歩行させます。
ノード全体の流れは以下のような感じになります。ノードをコピーしたい方は一番下までスクロールしていただければと思います。

前提

使用テンプレート:FirstPersonTemplate
UEバージョン:4.26

手順

レベル上にアクターを配置(スプライン用)

アクターを配置したら、アクターを選択し、詳細タブで ”コンポーネントを追加” から”Spline”を選んで付属させます。
Alt+ドラッグでSplineの点を増やしている様子

Splineの点を選択した状態でドラッグすると、Spline を伸ばすことができます。
さらにAlt + ドラッグで Spline 内の点を増やすことができます。

FirstPersonCharacterのブループリント(以後、 FirstPersonBP)を開く

開いたら変数を2つ追加します。
変数名:RouteA  変数の型: Actor (オブジェクト参照)
変数名:Current Spline 変数の型: Spline Component (オブジェクト参照)

RouteA のインスタンス編集可能にチェックを入れ、アウトライナ上から設定できるように変数を公開(目のマークが表示されるように)します。

公開された RouteA にSplineを所持したアクターを割り当てます。
あとは FirstPersonBP 内で一番上の画像のようにノードを組めばできあがります。

ノードの説明

Move(TimeLineノード)


Timelineにはフロート型のトラックを追加し、縦軸の値が0から1になるように設定します。
横軸は時間なので、とりあえず3秒間で設定しています。

Get Spline Length


スプライン全体の距離を取得します。
そこにTimelineの値(Long Across Spline:0.0~1.0)をかけて、全体距離の何パーセントにあたるかを割り出します。
TimeLineを再生すると0.1秒、0.2秒とどんどん時間が経過していくので、その経過時間に応じた (Long Across Spline:0.0~1.0) の値を取得できます。
Timelineの時間は3秒に設定しているので3秒経過すると Long Across Spline からは1が取得できます。
1×Get Spline Length = Splineの最終地点なので、
3秒かけてSplineの最終地点までPlayerを運ぶ流れです。
経過時間に応じた、進行距離を導き出せるので、とても重要な部分になります。

Get Direction at Distance Along Spline


Spline上の距離に応じた方向を取得できます。
レールの上に立っている場合、足元のレールが右に向いているか左に向いているかを知らないと、レールに沿った移動ができません。
PlayerをSplineに沿って移動させるためには、Playerの足元のSplineが伸びている方向を取得し続ける必要があります。
ここでは、経過時間に対するSpline上の距離、その値を ”Distance” の項目に繋げています。

Get Rotation at Distance Along Spline


Spline上の距離に応じた回転を取得できます。
ここで取得した回転を設定しないと、Playerキャラクターは移動すれど、カメラが進行方向を向いてくれない状態になります。
Splineに沿ってカメラを回転させるさせるため、これも取得し続けます。
ここでも、経過時間に対するSpline上の距離、その値を ”Distance” の項目に繋げています。

まとめると

Timelineが0.1の時は、Splineの長さの10%時の位置や回転、方向などを取得することができるようになります。
Playerを歩かせたいので、Set Actor Location 等は使わずに、Add Movement Input と Set ContRol Rotation を使いました。
これでPlayerはSplineに沿って自動で移動し、スプラインが曲がっていてもPlayer自身やカメラも回転してくれていると思います。
また、Splineがどういうものかイマイチわからない方は下の記事を読んでみるのが良いかもしれません。ざっと読むだけでも、こういう使い方があるのかと参考になる内容です。画像とかも多いので画像に目を通すだけでも情報がなんとなく頭に入ってくると思います。
https://historia.co.jp/archives/21842/

コピペ用

Discussion