LoginSignup
17
5

More than 1 year has passed since last update.

シームレスなカットシーンを実現するために

Last updated at Posted at 2022-12-01

まずは今回作った動画から。ボス登場演出的なやつ。

インゲームのカメラとブレンドする

カット開始/終了のフレーム区間でカメラをブレンドする機能。
8e07e444e4ce9d99daef4edf36294d6a.png
カメラカットでメニューを開き ブレンド可能 にチェックを入れると、カットの前後でブレンド区間が設定可能になります。
5c74ed71bcb04bc1e93cc0bf36511ecd.gif
カット端の左上&右上でドラッグする(実際かなり押しづらいがw)。

複数のカメラカット間でもブレンドできます。詳しくはヒストリアさんの記事でどうぞ。

やったこれだけでブレンドできたぞ!!すごい!!!

インゲームで再生したときにレターボックスが表示される

b0361270b532a67e76ba337c6d1eee98.gif
ブレンド区間で左右が黒く塗りつぶされる場合があります。
6d574f990957ec6a7a25d9e5703e4464.png
CineCameraActorConstrainAspectRatio がデフォルトで ON になっているため。明示的に OFF にしましょう。

ゲーム内のアクターで置換する

レベルシーケンス内のアクターを、ゲーム側でスポーンしたアクターに置き換える機能。
c323ebc0ebd337091fe70622d80814ef.png
まずはシーケンサ内にキャラクターを追加します。
コンテンツブラウザから、シーケンサのウィンドウにドラッグするだけで OK。

SkeletalMesh ではなくゲームでスポーンする BP を配置する。
回転軸の変換や、コリジョンによる接地などがそのまま反映されるため。

Possessable ではなく Spawnable の状態にする必要があります。アイコンに雷マークついてるやつ。

置換するアクターにタグをつける

224e96de5c4b83b97d7071ca09a2a9f9.png
バインドするアクター毎にタグを追加する。
4fefaf79392cbb1d2e837c9b50f82d77.png
ここで入力した名前が、BP での指定に使われます。分かりやすい名前をつけてあげましょう。

Blueprint でバインドを指定する

8b7d71fe05750fe0af37b8e83b5b91fe.png
LevelSequenceActor に対して AddBindingByTag でアクターをバインドする。これでシーケンサ内で操作していたアクターはスポーンされなくなり、ゲームのアクターにトラックが反映されるようになる。Boss アクターは予め適当な場所にスポーンさせておく。
しかしこのままでは、シーケンサが終了すると同時にアクターは元の状態に戻されてしまいます。トランスフォームトラックの項で後述。

アニメーショントラックの設定

94640db33661b7ffe8737b69c15e611d.png
シーケンサで再生するアニメーションを アニメーショントラック に追加します。

BP 内に複数の SkeletalMesh が存在する場合は、追加するトラック一覧に アニメーショントラック が表示されません。
CharacterMesh0 など、メッシュのトラックを追加した上で、改めてアニメトラックを追加する必要があります。

AnimMontage は未対応、AnimSequence or AnimComposite のみ指定することができます。
163337eceb98a7cd74d827f9aa7a229d.png
アニメトラック内でブレンドやアニメ尺を調整することも可能。
ていうかこの機能 AnimComposite にも欲しい。。

RootMotion を利用したい

RootMotion の移動値を反映させたい場合。以下の方法があるようです。

Sequencer Non-Linear Animation (NLA) Tools (Beta)

しかしアクターを置換する場合など、SkeletalMeshComponentAnimationModeUseAnimBlueprint になっている場合はルートが動いてくれない。
7dd3fdb9d284fecf1a81ba161cb9dd3b.png
ForceCustomMode にチェックを入れれば動くのだが、実際に更新されるのはメッシュ本体だけで、アクター自体はその場で停止する。SwapRootBone を指定しても座標軸がズレたり、期待した動作にはならなかった。

アニメーションルートからインポート

43a785ef14b6426d64828b27ae2a6dad.png
トランスフォームトラックは AnimSequence から RootMotion をインポートすることができるらしい。しかしやはりメッシュ本体の座標軸で動作するなど、期待した動作には(ry。結構古い機能で今後廃止になっていく感じがする。

この辺は沼ってるので詳しい人教えてください。今のところはトランスフォームをそれっぽく打ち込むことにしてます。。

トランスフォームトラックの設定

be47de65abc8cc6f177803e02ad467dd.gif
バインドしたアクターのトランスフォーム(&アニメ、その他)は、シーケンサの停止とともに元の状態に戻されてしまう。
c082ee6bf163fdcae80dc4ff84c739b4.png
トラックから セクションの編集WhenFinishedKeepState に変更することで、状態が維持されるようになる。シーケンサの最後の状態をゲームに引き継いでくれます。

途中からトランスフォームを反映させたい

シーケンサの途中で指定位置にテレポートするなど。サンプル動画の後半プレイヤー位置を参照。
b4d6dd83e7d9b318161024187a06caaa.png
キーを打つと左右にトラックが伸びた状態で保存されます。このときキーの前後、全てのフレームで左右端の値が反映されます。つまりプレイヤーは最初のフレームから指定位置にテレポートすることになる。
ad3af64d1be3c6c18cafc9032c7996b7.png
トラックメニューから 編集 セクションの左側をトリム を実行すると、左側のトラック区間を切断し、値の反映を無効化することができます。
4e35cf85b19a49ac478cf59340bf446a.png

その他やっておくとよさそうな設定

ブレンド終了時のカメラ位置はリセットしておく

イベントトラックなどからカメラの位置をリセットする。してない場合は再生前のカメラ状態のままブレンドされる。

MovementMode を Flyng に変更する

分かりづらいですが、今回の動画では敵キャラが一部で浮遊しています。シーケンサエディタ再生上では問題ありませんが、ゲーム内では Pawn の挙動そのままで接地してしまい、望んだカットにならないことも。

シーケンサ再生時は AI を止める

e5ee464ff6aae11d6c9e8cf37bdfb280.gif
停止しないと、アニメ再生が同時にブレンドされてキモい感じに。

void AMyAIController::SetLogicPaused( bPause )
{
	if ( UBrainComponent* BrainComp = GetBrainComponent() )
	{
		FString Reason( TEXT( "from SetLogicPaused" ) );

		if ( BrainComp->IsRunning() )
		{
			if ( bPause )
			{
				BrainComp->PauseLogic( Reason );
			}
		}
		else
		{
			if ( !bPause )
			{
				BrainComp->ResumeLogic( Reason );
			}
		}

		BrainComp->RestartLogic();
	}
}

やり方は色々あるだろうけど、AI の一時停止。PauseLogic などは BP 公開されてないらしい。。

17
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
5