【Unity】CinemachineのVirtual Camera切替をコントロールする
今回はCinemachineのVirtual Camera間の切替時間をコントロールします。
#Cinemachine でカメラの切替 pic.twitter.com/aipJxHRTJF
— 椿 (@tsubaki_t1) 2018年4月3日
カメラの切替とCinemachine
Cinemachineはカメラの位置をVirtual Cameraとして保持しており、これを切り替えることで複数のカメラの位置や視点の先の切り替えを実現しています。
例えば下のように、後ろからのショットと壁の向こうからのショットが欲しい場合、二つのVirtual Cameraを用意してソレを切り替えれば、自分の欲しいショットが得られる訳です。
これは実は、カメラの挙動も切り替えが可能である事を意味します。
たとえば通常はキャラクターの周囲を自由に見舞わせるカメラだが、特定の場所に来たら横から視点になる…といった感じのカメラ切り替えも可能です。
もしくは壁に張り付いている時や特殊な動作中は特殊なカメラの動きをする、ボスキャラクターが出たら常にボスとプレイヤーが映る位置にカメラが移動する…等です。
実際のゲームを見てみると、結構場所や状況でカメラの動きが根本から変わってることは意外と多いです。マリオオデッセイとか特に。
カメラを切り替える
CinemachineにおけるVirtual Cameraの切り替え方法ですが、優先順位付けにより行われます。要するに「Forcus(virtualCamera)」みたいなAPIは無いです。
見ている要素は「現在アクティブなVirtual CameraのPriorityが最も高いもの」です。
つまりVirtual Cameraの付いたGameObjectをアクティブ・非アクティブ切り替えれば良いです。変化時、最大のPriorityを持つVirtual Cameraがメインカメラとして使われます。
例えば一定領域内で横スクロールカメラになって欲しい場所がある場合、一定領域内で通常のカメラよりPriorityの高いカメラを有効にすれば、カメラは切り替わってくれます。
もし特定のオブジェクトに明確に切り替えたい…みたいな場合は、Priorityをスクリプトで変更してやれば良いです。
なお、もしVirtual Camera A → Virtual Camera B → Virtual Camera Cのような順番でカメラを切り替えたい…みたいな場合は、Blend List Cameraを使うと良いです。チュートリアルやカットシーン以下のカットシーンでは、こういったアプローチも必要になるかもしれません。
カメラの切り替わる時間を制御する
GameObjectのアクティブ・非アクティブでVirtual Cameraを切り替える訳ですが、カメラの切り替えをもっとキビキビさせたいというケースもあります。
そういった場合は、Cinemachine BrainのDefault BlendやCustom Blendsを使用します。
まずDefault Blendでは、カメラ切り替え時の遷移時間とブレンドに使用するカーブを指定できます。ここでsecondsに5とか指定すれば非常にゆっくり、0.5等を指定すればキビキビと変化します。
ブレンドに使用するカーブは、Ease In Outでは滑らかに、Cutでは0秒で一瞬で切り替わります。
その下、Custom BlendsではVirtual Camera毎に切り替わる時間とカーブを指定できます。例えばズームするカメラは一瞬だがズームアウトは少し時間をかけて行う…みたいな事が出来ます。
Anyはどのカメラから来た場合でも反応する特殊な名前です。最終的に複数のVirtual Cameraから到達するような場合には、使うのが良いです。
なおCustom Blendsは名前でオブジェクトを検索してる点に注意です。名前が変化すると追跡できなくなる他、名前が一致してないシーンで開くとnoneと表示されます(名前が一致するシーンを開くと戻ってきます)
Timelineが使える状況ならTimelineでやると、タイミングを調整しやすいです。