ネリスさん備忘録

主にUE4の備忘録を残すよ!

【UE4】シームレスにつながるシーケンサの再生をする方法

久々の更新。

今回のお題はこれ。

プレイヤーカメラからシーケンサカメラへ遷移し、プレイヤーカメラへ戻るゲームではよくあるシーンの実装方法について。

 

大まかな説明をすると

  1. シーケンサを開始と同時にポーズをかけてシーケンサ用カメラを生成する
  2. ポーズ中のシーケンサ用カメラに対してSetViewTargetWithBlendを利用してカメラを遷移させる
  3. シーケンサを普通に再生する
  4. シーケンサ終了イベント時にプレイヤーにSetViewTargetWithBlendを行い元のカメラに戻す

という手順を踏む。

以下詳細と実際のコード

 

 

レベルシーケンサの準備とルール

レベルシーケンサを使うにあたって、注意事項が2つあり

1つ目はシーケンサ1フレーム目はカメラカットを設定しないこと

2つ目はシーケンサで使用するカメラを識別し取得できるようにしておくこと

 

1つ目についてはそのまま。1フレーム目にカメラカットを設定しない。

これはカメラをブレンドするにあたって、カメラカットに入るとそちらが優先されてしまい、カメラのブレンドが行えなくなるため。

もうシーケンサ作っちゃったよって人は-1フレーム目から開始したらいいんじゃないかな?

f:id:LunaNelis:20210224013209p:plain

 

2つ目については後々ブレンド先として利用したいため、カメラを特定する情報を設定する必要がある。

シーケンサで使っているカメラを選択して、詳細タブの中からTagsを探す。
そして識別できるようにタグを追加しておく。
(今回はSequencerActorという名前にした)

f:id:LunaNelis:20210224013959p:plain

これでシーケンサの準備は完了。

 

カメラのブレンドシーケンサ再生までの実装

※同一の状態を作れればこの処理を崩しても問題ないことを先に言っておきます
 アレンジしろ

 

まず、シーケンサを作成し設定としてPauseAtEndTrueにする。
これはシーケンサが終了した際に勝手に終わらずに残り続けるという処理。
シーケンサ終了後にブレンド元のカメラが勝手に消えないようにするためのもの。

直後PlayをしてPauseで止める。
これによってシーケンサ内のカメラが確実に存在する状況を作成する。

f:id:LunaNelis:20210224014950p:plain

その後Cineカメラをタグで検索し、シーケンサ内のカメラに向かってブレンドを行う。
ここでほかのカメラと混ざらないようにするためにあらかじめタグをつけておいた。

f:id:LunaNelis:20210224015710p:plain

あとは終了時のイベントをバインドし、通常通りシーケンサを再生すればシーケンサを始めるまでのカメラ遷移は完成。

f:id:LunaNelis:20210224015823p:plain


シーケンサ終了~プレイヤーカメラへのブレンド実装

 シーケンサ終了時に呼ばれるイベントは以下の通り。

まず1フレーム待機するためにDelay0をはさむ。
これはこのイベントが呼ばれた瞬間はまだカメラカットが有効になっており、カメラのブレンドが失敗するためである。

ブレンドが終わったらGotoEndAndStopシーケンサを終了して完了。
ステージギミック等でシーケンサが消えるのは良くない場合はGotoEndAndStopは省いてもOK

f:id:LunaNelis:20210224020353p:plain

 

やってみると意外と短いノードで実装できるため、おそらく誰でも扱えると思う。

 

 

あとがき

プレイヤーの普段のカメラがプレイヤーキャラクターのものではない場合、戻り先のブレンド先はこの限りではない。

今回の実装はカメラが遷移し終わってからシーケンサが再生されるため、必殺技などのアクションシーンではそのまま使えない。
その場合ポーズはせず、シーケンサ側にブレンド用のカメラカットの存在しない時間を用意する必要がある。

個人的にSetViewTargetWithBlendのBlendFuncはEaseInOutのExp2ぐらいにするといい感じになると思ってる。