Cinemachineで視点切り替えと同時にモデルを切り替えるようにしているんだけど、画面がちらついて困っているの…
カメラの切り替わりが数フレームずれているみたいね。カメラの切り替わりタイミングを見てモデルを切り替える必要がありそうね。
バーチャルカメラのPriorityなどを変更してカメラを切り替えるとき、実際にバーチャルカメラが切り替わるまで数フレーム遅れることがあります。
主に、Cinemachine Brainのカメラ更新タイミングをFixed Updateにしているときに発生します。
このようにフレームのずれに起因する問題の場合、実際にバーチャルカメラが切り替わる瞬間で処理することで解決可能です。
先の動画は、バーチャルカメラのPriorityを変更した瞬間にモデルを切り替えていたため、画面のちらつきが発生しています。これを実際のバーチャルカメラが切り替わるタイミングにずらすことで、次のようにちらつきを抑えることができます。
切り替わりのタイミングは、Cinemachine Brainが通知するイベントで分かります。
本記事では、このイベント機能を使い、カメラの切り替わりのフレーム遅れに対処する方法を紹介します。
- Unity2021.1.21f1
- Cinemachine2.7.8
カット切り替えを通知するイベント
カメラ切り替えを管理するCinemachine Brainには、切り替わりタイミングを通知する機能が備わっています。
Cinemachine Brainでカメラがカットで瞬時に切り替わるとき、CameraCutEventイベントが発火します。このイベントは、CinemachineBrain.m_CameraCutEventフィールドとして定義されています。
参考:Class CinemachineBrain| Cinemachine | 2.8.9
このBrainEvent型の実体は、CinemachineBrainオブジェクトを引数に受け取るUnityEvent型です。
参考:Class CinemachineBrain.BrainEvent| Cinemachine | 2.8.9
UnityEvent型なので、Cinemachine Brainのインスペクターからイベントを指定することも可能です。
なお、カット切り替えを行うためには、Cinemachine Brain側のブレンドにCutが指定されている必要があります。
また、カットの切り替わりタイミングは、後述するCinemachine.m_CameraActivatedEventイベントでも知ることができます。
サンプルスクリプト
バーチャルカメラのカット切り替えタイミングでデバッグログを出力するサンプルです。
上記スクリプトを適当なゲームオブジェクトにアタッチし、Cinemachine Brainオブジェクトを設定します。
実行結果
スクリプトの解説
次の部分でカット切り替え時に発火するイベントに登録します。
コールバック側では、CinemachineBrainオブジェクトを引数として受け取るため、ここから切り替わった後のバーチャルカメラを取得します。
CinemachineBrain.ActiveVirtualCameraプロパティより、現在有効なバーチャルカメラが得られます。
参考:Class CinemachineBrain| Cinemachine | 2.8.9
カット・ブレンド切り替え両方を通知するイベント
バーチャルカメラをカットではなくブレンドで切り替える場合、前述のm_CameraCutEventは発火されません。
ブレンド切り替え含む切り替えは、CinemachineBrain.m_CameraActivatedEventフィールドから知ることができます。
発火のタイミングは、カット時またはバーチャルカメラ切り替えのブレンドが開始される瞬間です。
CinemachineBrain.VcamActivatedEvent型の実体は、2つのICinemachineCameraを引数に受け取るUnityEvent型です。
参考:Class CinemachineBrain.VcamActivatedEvent| Cinemachine | 2.8.9
第1引数には切り替え後、第2引数には切り替え前のバーチャルカメラが格納されます。
こちらもUnityEvent型なので、インスペクターから設定することも可能です。
参考:Changelog | Cinemachine | 2.8.9
また、ブレンド切り替えを有効にするためには、Cut以外のブレンドで切り替える必要があります。
サンプルスクリプト
バーチャルカメラの切り替わりタイミングでログを出力するサンプルです。
こちらも1つ目のスクリプト同様、適当なゲームオブジェクトにアタッチし、Cinemachine Brainを設定します。
実行結果
ブレンド開始時に切り替え前と後のバーチャルカメラが取得できていることを確認できました。
さいごに
Cinemachineのバーチャルカメラ切り替えは、必ずしもPriorityの設定をした瞬間に行われる訳ではないことに注意が必要です。
カメラが切り替わった瞬間に何かしらの処理を行いたい場合、CinemachineBrainのイベントを利用して非同期的に行う形になります。
同様の問題に行き詰っている方の一助になれれば幸いです。