【Unity】Cinemachineのカメラ位置や向きを、自分のスクリプトで制御する
Cinemachineを紹介すると「自分のシステムと相性が悪い」や「使い方が難しい」といった意見をよく聞きます。
とは言えCinemachineが提供する「演出用カメラワークへのシームレスな移動」や「めり込み抑制や振動といったエフェクト」、「手ブレ」は使いたい所です。
なので今回は、可能な限り自分でカメラの回転や座標を制御しつつCinemachineの追加機能を使う方法について考えてみます。
- Virtual Cameraを自分で制御したい
- Virtual Cameraを特定のオブジェクトと同期させる
- 座標は自分で設定したいが向きだけはCinemachineの機能を使いたい
- ちゃんとCinemachineの機能に則って動きを作りたい
Virtual Cameraを自分で制御したい
Cinemachineは概ね3つの機能で構成されています。後付で様々な機能が追加されていますが、根底はこの3つです。
- Virtual Cameraの位置を制御するFollowとBody
- Virtual Cameraの回転を制御するLookAtとAim
- Virtual Camera同士をブレンドするCinemachine Brainコンポーネント
実際は微妙に違うと言えるかもしれませんが、大体このニュアンスでOKです。
要するに、BodyとAimを無効化(Do Nothing)してしまえば、Virtual Cameraの座標・向きの変化は停止します。自分自身でVirtual Cameraを動かしても問題なくなります。
後はVirtual CameraをセットしたGameObjectのTransformを自分の好きなように動かしてやれば良いという訳です。
Virtual Cameraの動きは自分の定義したスクリプトで動かしても、
またDoNothing担っている場合でも、Virtual Cameraに設定されているExtensionsは動作します。なお、幾つかのExtensionsはLookAtを要求します。
Virtual Cameraを特定のオブジェクトと同期させる
Virtual Cameraを特定のオブジェクトと同期させるアプローチについてです。
多分コレは任意のオブジェクトを元に移動させるとか、そんな用途の機能と思われます。要するにPOVです。
もちろんUnityでは「子オブジェクトにする」というアイディアもありますが、階層が深いのは余り良くないです。
まずVirtual Cameraを別のオブジェクトと完全に同期させてみます。
特定のオブジェクトをフォローさせたい場合、Followに追跡したいGameObjectをセットしBodyはHard Lock To Target、AimはSame As Follow Targetです。
SameAsFollowTargetのみLookAtではなくFollowを要求しています。多分PostProcessingStack拡張のDOFがAIM依存なのでソレを気にしてるんじゃないかなという気もしますが、どうなんでしょう。
ところでPOV系の動画を見ると自分一発で酔う事があるんですが、自分だけですかね?デッドプール2の逆さまになって銃撃するシーンとか超しんどかった
座標は自分で設定したいが向きだけはCinemachineの機能を使いたい
座標は自分の指定した動きをしてもらいたいが、向きだけはCinemachineのComposerを使いたいという場合です。
例えばジブショットのような連続した動きをCinemachineでやらせようと思ったら、地味に面倒くさいですが、向きと座標込でアニメーション作るのも正直面倒くさいので移動はアニメーションやパス、向きはCinemachineにやらせるという話です。
考え方は単純で、FollowにAnimationやSplineで動かすオブジェクトを指定し、BodyにHardLockToTargetを指定。LookAtにフォーカスしたい対象を指定してComposerを使うというだけです。
コレの良いところは移動中にフォーカスしたい対象を切り替えられる点です。例えば下のGif動画では、移動の途中にフォーカス対象をゆっこからユニティちゃんへ切り替えています。
「移動先を見る」だけならそれ程難しくはないのですが、見せたいものがある場合には結構良いかなという感触です。
ちゃんとCinemachineの機能に則って動きを作りたい
CinemachineComponentBaseを継承したクラスを作ると、自分のオリジナルCinemachine動作が作れます。