今回はCineMachineを使ってカメラの切り替え等を行ってみたいと思います。
CineMachineはUnityさんが作った追加アセットで、カメラの動きを作成するのに便利です。
Timelineでの使用や通常のゲームでの使用が可能です。
Timelineについては
を参照してください。
CineMachine
CineMachineは追加でアセットをダウンロードする必要があります。
UnityでCtrl+9キーを押してAsset Storeを開いたらCineMachineで検索するとすぐ出てきます。
CineMachineのインポートが終わるとUnityのメニュー項目にCinemachineメニューが追加されます。
↑のようにいくつかの項目があります。
Aboutを選択するとCineMachineのマニュアルページを開きます(細かい情報はそちらを参照してください)。
基本はVirtual Camera(仮想カメラ)でそれ以外はそれを拡張した感じですね。
TimelineにはCinemachine Trackを追加出来るようになります。
その為、通常のゲームのカメラの挙動だけでなくTimelineを使った時のカメラの挙動も作成する事が出来ます。
CineMachineの概要
CineMachineは仮想カメラ(実際のカメラを作成しない)を設置して、既存のカメラ(例えばMainCamera)の動きを作成します。
その為、実際のカメラにはCinemachine Brainコンポーネントを取り付け、仮想カメラから動かす事が出来るようにします。
後は仮想カメラを作成し、Cinemachine Brainコンポーネントを取り付けたカメラを操作するように設定していくという感じになります。
仮想カメラで実際のカメラを操作してみる
まずは基本のVirtual Cameraをヒエラルキー上に配置しキャラクターを追いかけるようにしてみます。
キャラクターにはAnimatorControllerと、移動スクリプトが既に取り付けられている必要があります。
Main CameraにはインスペクタでAdd Component→Cinemachine Brainを取り付けておきます。
ヒエラルキー上で右クリック→Create Emptyで空のゲームオブジェクトを作成し、名前をNormalVirtualCameraとします。
この後いくつかの仮想カメラを作成していく為、階層を分けて作成していく事にします。
UnityメニューのCinemachineからCreate Virtual Cameraを選択し仮想カメラを作成したらNormalVirtualCameraの子要素に移動しておきます。
Main CameraにはCinemachine Brainコンポーネントを取り付けているので、赤い四角の部分にCinemachineのアイコンが表示されるようになります。
CinemachineVirtualCameraコンポーネント
次に仮想カメラ(CM vcam1)を選択するとインスペクタでCinemachine Virtual Cameraコンポーネントが取り付けられているのがわかります。
Statusの右のSoloボタンは押すとこの仮想カメラで写した映像が表示されます。
このカメラが写す映像を確認したい時に押すと便利です。
Game Window Guidesにチェックを入れるとカメラがターゲットを追いかける時の設定をGameビューで確認出来るように枠を表示します。
Save Duaring Playにチェックを入れるとUnityEditorで実行中に仮想カメラの設定を変えた時の変更値が実行を終えた時にも反映されます。
実行しつつ設定値を変更したい時はチェックを入れるといいです。
Priorityはこの仮想カメラの優先度で数値が高いほうが優先度が高くなります。
複数の仮想カメラがある時にカメラの優先度を付けたい時はそれぞれの仮想カメラのPriorityを変更します。
Followはカメラが追いかける対象を設定します。
LookAtはカメラが見る部分を指定します。
Lensはカメラの設定で、
FieldOfViewは視野
Near Clip Planeはカメラのレンズに映る一番近い位置
Far Clip Planeはカメラのレンズに映る一番遠い位置
Body
Bodyはカメラ本体の動きに対する設定です。
Donothingに設定するとカメラの本体は動きません。
Framing Transposerはフレーム毎に位置を移動させます。
設定を少し見てみましょう。
Lookahead Timeは本体がターゲットを移すまでの時間
Lookahead smoothingはターゲットを移す時のスムーズの度合い
X、Y、ZDampingは本体がX、Y、Z軸の変更の減衰率で値が低いほうが応答性が高いみたいです。
ScreenX、ScreenYはカメラの中心がスクリーン上のどこか
Camera Distanceはターゲットからカメラの距離
DeadZoneのWidth、Height、Depthはカメラが移動しない範囲の設定でその幅、高さ、深さを設定します。
Unlimited Soft Zoneにチェックを入れるとソフトゾーンが無制限になります。
SoftZoneのWidth、Heightはカメラが徐々にターゲットの方向を向かせる範囲の設定で幅と高さを指定します。
BiasのXとYは調整位置です。
↑の透明部分がデッドゾーンで青い部分がソフトゾーン、赤い部分がそれ以外の範囲でここでは徐々にではなく一気に位置を移動します。
Hard Lock Targetは徐々に遷移させず、すぐにターゲットの方向を向きます。
Orbital Transposerはマウスなどの操作でカメラを回転させる設定です。
Orbital TransposerにするとBinding Modeが表示されますが、これはカメラの本体をどこに拘束して回転させるかの設定みたいですがよくわかりません。
デフォルトではMouse X(マウスを横に移動する)操作でターゲットに対して回転しますが、Mouse Xの部分をInputManagerの他の設定の文字列を指定すればその操作で回転します。
細かな設定が他にもありますが・・・ここはスルーしていきます。
Bodyの設定に戻りましょう。
Tracked Dollyはカメラのいくつかのポイントを作成し、そのポイントを繋げたカメラレールの上をカメラが移動する設定の時に使用します。
Transposerはシンプルなターゲット追跡の設定です。
Bodyの設定やBinding Modeの設定は多くありますが、不明な点も多いためCinemachineのマニュアルを参照してみてください。
Aim
Aimはターゲットの方向を見る為の設定です。
Composerの設定はBodyのFraming Transposerの設定と同じですね。
Noise
Noiseはカメラがターゲットの方向を向いたときに固定されたままにせず手で持っている時のような手ブレを表現したい時に使用します。
プリセットで用意されている項目を選択しブレの設定を行います。
Extensions
Extensionsは拡張機能を追加する時に使用します。
Cinemachine Virtual Cameraコンポーネントの設定はこんな感じです。
だいぶ端折ってますが、細かい説明はマニュアルに任せましょう・・・・(‘◇’)ゞ
実際にCinemachineを使ってみる
とりあえずCinemachineVirtualCameraコンポーネントを見てきたので、
UnityメニューのCinemachineから作成出来る仮想カメラをいくつか使ってみましょう。
個々の仮想カメラを試す時は他の仮想カメラの親を非アクティブにして作用しないようにしてください。
また仮想カメラのFollowにはキャラクター、LookAtにはキャラクターの頭を設定します。
Virtual Camera
まずは基本のVirtual Cameraを使って、キャラクターを追いかけるようにしてみます(既にNormalVirtualCameraの子要素に設置しています)。
Followにはキャラクター、LookAtにはキャラクターの頭を設定しました。
実行してみると、
↑のような感じで実際のカメラ(Main Camera)が仮想カメラ(CM vcam1)の設定によってキャラクターを追いかけるように移動しました。
Free Lock Camera
次はFree Lock Cameraを使ってみます。
Free Lock CameraはTopRig、MiddleRig、BottomRigの3か所の位置と半径を設定し、その範囲の中で視点を手動で変化させることが出来るカメラです。
空のゲームオブジェクトを作成し、名前をFree Lock Cameraとし子要素にUnityメニュー→Cinemachine→Create FreeLock Cameraを選択し作成します。
通常のVirtual Cameraと同じようにキャラクターを追いかける設定をしつつ、マウス操作で視点を変更してみます。
Followにはキャラクター、LookAtにはキャラクターの頭を設定します。
Spline Carvatureを変更するとTopRig、MiddleRig、BottomRigを繋ぐスプライン曲線の曲線を変更できます。
TopRig、MiddleRig、BottomRigの位置や半径はその下の項目で設定できます。
カメラの移動設定はそれぞれのRigの設定で変更出来ます。
それでは試してみましょう。
↑のようにキャラクターを追いかけるだけでなく視点の変更も出来ました。
Binding ModeをSimple Follow With World Upにしていたのでキャラクターの後ろの方にカメラが移動してしまってますが、ここをWorld Space等に設定すれば最初のVirtual Cameraと同じような感じにできます。
State Driven Camera
次はState Driven Cameraを使ってみます。
State Driven Cameraは設定したAnimatorの遷移状態によって仮想カメラを切り替える事が出来ます。
空のゲームオブジェクトを作成しStateCameraとし、子要素にUnityメニュー→Cinemachine→Create State-Driven Cameraを選択し作成します。
↑のような階層が出来、CM StateDrivenCamera1で設定が出来ます。
その子要素の仮想カメラが切り替えるカメラでCM StateDrivenCamera1のインスペクタから切り替えるカメラを追加できます。
今回は以下のような設定にします。
Animated Targetに設定したAnimatorの遷移状態に応じてカメラを切り替えます。
Default Blendでカメラ切り替え時の補間の設定を行う事が出来、徐々に切り替えたり、パッと切り替えたりといった設定が出来ます。
しかし、ここでの設定は全てのカメラの切り替え時に使用されます。
個別のカメラ毎に設定を変更したい時はCustom Blendsの右側のCreate Assetを押すと設定ファイルを保存するダイアログが表示されるので、設定ファイルを保存します。
インスペクタで+の部分を押して個別のカメラの設定を作成することが出来ます。
Stateで実際にAnimatorの状態と仮想カメラを設定します。
今回はキャラクターがIdleの時はCM vcam2、Walkの時はCM vcam3という名前の仮想カメラに切り替えることにしました。
Waitはそのカメラから別のカメラに切り替え始めるまでの時間です。Minはわかりません。
実際に動かしてみると、
↑のような感じでIdle状態とWalk状態で仮想カメラを切り替える事が出来ました。
特別なアニメーションの状態の時にカメラを専用の視点に切り替えたい時などは便利かもしれませんね。
Clear Shot Camera
次はClear Shot Cameraを使ってみます。
Clear Shot Cameraはカメラのコライダの範囲に指定したターゲットが侵入したらカメラを切り替えることが出来ます。
空のゲームオブジェクトを作成し、名前をClearShotCameraとし、子要素にUnityメニュー→Cinemachine→Create Clear Shot Cameraを選択し仮想カメラを作成します。
↑のような階層になります。
ClearShotCameraの子要素にCubeを作成し、Scaleを調整して二つの仮想カメラの間に壁を作成します。
↑のような感じで仮想カメラの間にCubeで壁を作成しています。
左側がCM vcam4で右側がCM vcam5になります。
CM ClearShot1を選択し、インスペクタで設定をします。
LookAtにはキャラクターを設定し、仮想カメラがキャラクターの方向を向くようにします。
CM vcam4のPriorityを11にし、CM vcam5の仮想カメラと被った時はCM vcam4の優先度を上げます。
CM vcam4やCM vcam5の仮想カメラにはCinemachine Colliderというコンポーネントが取り付けられています。
Collide Againstが障害物とするゲームオブジェクトのレイヤーです。
Ignore Tagで除外するタグを指定。
Minimum Distance From Targetはこの距離より近い障害物は対象外になります。
Avoid Obstaclesにチェックを入れると障害物を回避します。
Distance Limitは距離の制限
Camera Radiusは障害物からこの距離を保ちます。
Strategyは障害物を回避する方法。
Dampingは減衰値
Optimal Target Distanceは最適なターゲットとの距離。
です。
CM vcam4とCM vcam5のCinemachine ColliderのStrategyをPull Camera Forwardにし、カメラが壁と被ったらカメラの位置を壁の位置に移動するようにします。
壁と被った時にどうなるかを確認する為、CM ClearShot1のDefault Blendのsecを5にし切り替わるまで5秒かかるようにします。
実行すると
↑のような感じでカメラのコライダにキャラクターが接触したら優先度に応じてカメラを切り替えることが出来ています。
CM vcam4の方がCM vcam5より優先度が高いため、同時にコライダに接触していてもCM vcam4が優先されています。
Dolly Camera With Track
最後にDolly Camera With Trackを使用してみます。
Dolly Camera With Trackは仮想カメラと仮想カメラの移動ポイントを組み合わせ、カメラの位置をレールに乗って動かすような事が出来ます。
空のゲームオブジェクトを作成しDollyCameraとし、その子要素にUnityメニュー→Cinemachine→Create Dolly Camera With Trackを選択し作成します。
↑のような階層になります。
CM vcam1が仮想カメラでインスペクタを見ると、
↑のようにBodyのPathにDollyTrack1が設定されていて、Path Positionの値を変えるとDollyTrack1で作成したカメラ位置の間を動きます。
今回は自動でキャラクターを追従させたいので、Auto Dollyのチェックを入れ自動で動くようにします。
DollyTrack1のインスペクタではカメラの移動ポイントをいくつか作成します。
Loopingのチェックを入れると最後の点と最初の点が繋がるようになります。
今回作成した移動ポイントは
↑のようになります。
それではキャラクターを動かして確認してみましょう。
↑のようになりました。
キャラクターの移動先に合わせてカメラレールの上をカメラが移動しているのがわかりますね。(‘ω’)ノ
TimelineにCinemachine Trackを作成する
最後にTimelineにCinemachine Trackを作成し、そこで仮想カメラの切り替えをしてみたいと思います。
TimelineウインドウのAdd→Cinemachine Trackを選択します。
Cinemachine Trackを選択した状態で右クリック→Add Cinemachine Shot Clipを選択します。
今回は2つのCinemachine Shot Clipを作成します。
ヒエラルキー上にUnityメニュー→Cinemachine→Create Virtual Cameraを2つ作成し、Followにキャラクター、LookAtにキャラクターの頭を設定します。
作成した仮想カメラの位置等を調整し、2つの視点を作っておきます。
Cinemachine Trackに作ったクリップを選択し、インスペクタで仮想カメラをそれぞれ設定します。
Cinemachine Trackには実際のカメラであるMain Cameraを設定します。
最終的には
↑のようになりました。
それでは確認してみます。
↑のようになりました。
クリップに応じてカメラが切り替わっています。
PostProcessing Stack V2について
参考サイトのUnityのCinemachineのチュートリアルではPostProcessing Stack V2(PostProcessing Stackのベータ版?)を使用しています。
PostProcessing Stack V2は
でダウンロード出来ますが、一旦Unityに取り込んだ後V2の削除をするとエラーが出て通常のPostProcessing Stackが使えなくなります。
そんな時は再度PostProcessing Stack V2をインポートするか、UnityメニューのEdit→Project Settings→Playerを選択し、インスペクタでScriptingDefineSymbolsの設定で、
UNITY_POST_PROCESSING_STACK_V2を削除するとエラーが消えました。
V1や他の設定は消しません。
一応同じようなエラーが出た人の為に書き残しておきます・・・・(-_-)