🎥

【UE5】シーケンサーでの演出途中からプレイヤーキャラクターを動かしたい【プロジェクト配布】

2024/06/27に公開

やりたいこと

A.シーケンサーでPlayerCharacterを動かしたい
B.途中まではシーケンサーで動かして、途中からはプレイヤーによって動かしたい
C.最後はシームレスにプレイヤーカメラに移行したい
結果だけ先に展開。

はじめに歩くモーションの演出があり途中から自由入力

環境

  • UE5.3.2
  • ブループリントプロジェクト
  • ThirdPersonTemplate

実装

シーケンサー

レベルにレベルシーケンスを配置。

カメラ・ThirdPersonCharacterをSpawnableに配置

Spawnable=シーケンサー動作中にSpawnする設定。イナズマのアイコンが目印。

このカメラはのちにBPからViewTargetとしてセットするため、ActorTagを仕込んでおく

"SequencerCamera"
コンテントブラウザからThirdPersonCharacterをシーケンサー内にドラッグドロップするとSpawnableとなる。このトラックにはのちにBPからPlayerCharacterをバインドするため、ObjectTagを仕込んでおく。ObjectTagは上記のタグとは異なり、シーケンサー関連の機能で使うためのタグ。

"Player"

カメラ・ThirdPersonCharacterにキーフレームを設定

カメラにTransformを、ThirdPersonCharacterにアニメーションとTransformを設定する。
このとき SectionRange(緑の斜線のバー) に注意すること。

カメラのTransformやCameraCutsのSectionRangeはEndTimeまで続くようにする。

画面中央を見下ろしながら旋回するTransformのキーフレーム
ThirdPersonCharacterの各トラックでは、SectionRange中はプレイヤーの入力を受け付けないため、SectionRangeを良い感じに調整する。

歩きモーションと前進させるTransformのキーフレーム。シーケンサーの途中でトラックが終わるように設定しておく
Transformはデフォルトでは無限にバーが続くようになっているので、プロパティからSectionRangeのロックを外し直接指定する。

また、TransformのプロパティからWhenFinishedをKeepStateに設定する。トラック終了後もその位置からキャラクターの動作を始めさせたいため。

レベルBP

先に全容。今回はLevelSequenceActorをレベルに直置きした状態で始める。


以下それぞれの処理の解説。

LevelSequenceActorを取得し、SequencePlayerコンポーネントを変数化

仕込んだTagからシーケンサー内のカメラを取得

このときViewTargetをこのカメラに切り替えておく。後述のキャラクター操作と紐づけたいため。

ObjectTagから、ThirdPersonCharacterのトラックにPlayerCharacterをバインドする

SetBindingByTagでも可。挙動の違いは調べられていない。

シーケンサー終了時に発火するイベントをバインドする。

①:SequencerPlayerからピンを伸ばしBind Event On Finishedノードを作成
②:カスタムイベントを作成しバインドをつなぐ。SetViewTargetWithBlendでカメラをPlayerCharacterに戻すが、このときOnFinished直後だとシーケンサーとカメラを奪い合う挙動になってしまうらしいので、DelayUntilNextTickで1フレームだけ待機しておく。

シーケンサーをPlayする


この時点で、

  • プレイインするとシーケンサーが動き、
  • ThirdPersonCharacterにはPlayerCharacterがバインドされており、
  • ThirdPersonCharacterのSectionRangeに到達した場合プレイヤーが操作可能になり、
  • シーケンサー終了後デフォルトのカメラに戻る
    はずなので、それを確認する。

以降、PlayerCharacterへのインプットが気持ち悪いので、そのブラッシュアップを行う。

BP_ThirdPersonCharacter

Movement Inputのノードの一部を書き換える。
①:シーケンサー制御中にインプット入力をすると微動するのが不格好なのでBool変数で分岐し制御する。後述のシーケンサーBPでこれをTrueに書き換える。
②:シーケンサーカメラのときはGetControlRotationでは正しいカメラ画角が得られないため、この部分をGetPlayerViewPointに差し替える。

シーケンサーBP

シーケンサーにてイベントトラックを追加する


Triggerで
ThirdPersonCharacterのトラックに打たれたキーフレームの終了タイミングに合わせてイベントトラックのキーを打つ。

キーを右クリック。プロパティからCreateNewEndPoint

シーケンサーBPの画面になるので、GetPlayerCharacterからThirdPersonCharacterをキャストしMovementInputを止めていたBool変数を書き換える。

おまけ

シーケンサー再生中にもその裏でマウスによるFollowCameraが動作しているのでそれを制御する

シーケンサー終了時にあらぬ方向へカメラが戻ってしまうことがあるので、それを防ぐ。

BP_ThirdPersonCharacterのCameraInputにBool変数による分岐を追加

レベルBPにて、最後の処理に追記

DelayのDurationはViewTargetのBlendTimeと一致させる。

プロジェクト配布

サンプルデータはこちらです。
https://github.com/mori-studio/SeamlessCameraSample

Discussion