【UE4】シームレスにつながるシーケンサの再生をする方法
久々の更新。
今回のお題はこれ。
プレイヤーカメラからシーケンサカメラへ遷移し、プレイヤーカメラへ戻るゲームではよくあるシーンの実装方法について。
ありがちだけど、誰もがやりたがるであろう処理。
— ネリスさん (@NelisLuna) 2021年2月23日
プレイヤー→シーケンサのカメラブレンド#UE4 #UE4Study pic.twitter.com/ORTFTGG2Vj
大まかな説明をすると
- シーケンサを開始と同時にポーズをかけてシーケンサ用カメラを生成する
- ポーズ中のシーケンサ用カメラに対してSetViewTargetWithBlendを利用してカメラを遷移させる
- シーケンサを普通に再生する
- シーケンサ終了イベント時にプレイヤーにSetViewTargetWithBlendを行い元のカメラに戻す
という手順を踏む。
以下詳細と実際のコード
レベルシーケンサの準備とルール
レベルシーケンサを使うにあたって、注意事項が2つあり
1つ目はシーケンサの1フレーム目はカメラカットを設定しないこと
2つ目はシーケンサで使用するカメラを識別し取得できるようにしておくこと
1つ目についてはそのまま。1フレーム目にカメラカットを設定しない。
これはカメラをブレンドするにあたって、カメラカットに入るとそちらが優先されてしまい、カメラのブレンドが行えなくなるため。
もうシーケンサ作っちゃったよって人は-1フレーム目から開始したらいいんじゃないかな?
2つ目については後々ブレンド先として利用したいため、カメラを特定する情報を設定する必要がある。
シーケンサで使っているカメラを選択して、詳細タブの中からTagsを探す。
そして識別できるようにタグを追加しておく。
(今回はSequencerActorという名前にした)
これでシーケンサの準備は完了。
カメラのブレンド~シーケンサ再生までの実装
※同一の状態を作れればこの処理を崩しても問題ないことを先に言っておきます
アレンジしろ
まず、シーケンサを作成し設定としてPauseAtEndをTrueにする。
これはシーケンサが終了した際に勝手に終わらずに残り続けるという処理。
シーケンサ終了後にブレンド元のカメラが勝手に消えないようにするためのもの。
直後PlayをしてPauseで止める。
これによってシーケンサ内のカメラが確実に存在する状況を作成する。
その後Cineカメラをタグで検索し、シーケンサ内のカメラに向かってブレンドを行う。
ここでほかのカメラと混ざらないようにするためにあらかじめタグをつけておいた。
あとは終了時のイベントをバインドし、通常通りシーケンサを再生すればシーケンサを始めるまでのカメラ遷移は完成。
シーケンサ終了~プレイヤーカメラへのブレンド実装
シーケンサ終了時に呼ばれるイベントは以下の通り。
まず1フレーム待機するためにDelay0をはさむ。
これはこのイベントが呼ばれた瞬間はまだカメラカットが有効になっており、カメラのブレンドが失敗するためである。
ブレンドが終わったらGotoEndAndStopでシーケンサを終了して完了。
ステージギミック等でシーケンサが消えるのは良くない場合はGotoEndAndStopは省いてもOK
やってみると意外と短いノードで実装できるため、おそらく誰でも扱えると思う。
あとがき
プレイヤーの普段のカメラがプレイヤーキャラクターのものではない場合、戻り先のブレンド先はこの限りではない。
今回の実装はカメラが遷移し終わってからシーケンサが再生されるため、必殺技などのアクションシーンではそのまま使えない。
その場合ポーズはせず、シーケンサ側にブレンド用のカメラカットの存在しない時間を用意する必要がある。
個人的にSetViewTargetWithBlendのBlendFuncはEaseInOutのExp2ぐらいにするといい感じになると思ってる。