【Unity】【Cinemachine】対象が障害物に隠れた時に対象が映る位置にカメラをいい感じに移動するCinemachine Collider

CinemachineのCinemachine Colliderを使って、対象が障害物に隠れた時に対象が映る位置に良い感じに移動するカメラを作る方法をまとめます。

Unity2018.4.0
Cinemachine2.2.9

はじめに

この記事ではCinemachineの拡張機能であるCinemachine Colliderについて説明します。

Cinemachineの基本的な使い方やVirtual Cameraの設定方法は本記事では説明しません。
これらは以下の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

やりたいこと

いま、障害物によってカメラのLook At対象が隠れてしまうケースを考えます。

f:id:halya_11:20190701234343g:plain

このような時にCinemachine Colliderを使うと対象が見える位置にカメラを補正してくれます。

f:id:halya_11:20190701234531g:plain

この記事ではこの設定方法を紹介します。

設定手順

Cinemachine ColliderはUnityの衝突判定システムを使います。
そのためこれを使うにはまず障害物にColliderがアタッチされていることを確認します。

f:id:halya_11:20190701234752p:plain

次にVirtual Camera最下部のExtensionsからCinemachine Colliderを選択してアタッチします。

f:id:halya_11:20190701234831p:plain

Strategyでカメラ位置の補正方法を選択し、切り替わり時間をDampingとして設定します。
今回は下記のように設定しました。

f:id:halya_11:20190701235026p:plain

この設定でひとまず次のように障害物をよけるカメラが作れました。

f:id:halya_11:20190701234531g:plain

Strategyの種類

Strategyの設定により「障害物に隠れた時にカメラの位置がどう補正されるか」が変わります。

名前 説明
Pull Camera Forward カメラの前方方向に動かすことで補正
Preserve Camera Height カメラの高さをなるべく変えないように補正
Preserve Camera Distance カメラと対象との距離をなるべく変えないように補正

どれを選ぶかはケースバイケースですが、3つだけなのですべて試してみるのが手っ取り早いと思います。
参考までに、後ろに障害物(壁)がある状態でStrategyを変更するとこれだけ見た目に差が出ます。

f:id:halya_11:20190702000557p:plain

どのオブジェクトを障害物とみなすか

これまでの設定では、Colliderが設定されているものすべてを障害物とみなします。
特定のLayerのGame Objectのみを障害物とみなすには、Collide Againstにレイヤーを指定します。
ただしIgnore Tagに設定されたタグを持つGame Objectは無視されます。
プレイヤーなどカメラに映している対象にColliderがセットされている場合にはそれらが障害物としてみなされないように除外しておくとよさそうです。

f:id:halya_11:20190707013030p:plain

またMinimum Distance From Targetに値を設定すると、対象からその距離以内のものは障害物とみなしません。
つまり対象に近いオブジェクトを障害物にしないための設定です。

f:id:halya_11:20190702001315p:plain

その他の細かい設定

最後にその他の細かい設定をざっと説明して終わります。

まずAvoid Obstaclesですが、このチェックを外すとカメラの補正が行われなくなります。
しかし当たり判定計算だけはなされていて、他のコンポーネントと組み合わせて使うための機能のようです。

f:id:halya_11:20190702001548p:plain

Distance Limitに値を設定すると、カメラからこの距離までの当たり判定だけを取ります。
0に設定するとカメラから対象の距離まですべて当たり判定を取ります。

f:id:halya_11:20190702002033p:plain

Minimum Occlusion Timeに時間を設定すると、対象が隠れてからこの時間が経過してからカメラが補正されます。

f:id:halya_11:20190702002129p:plain

Camera Radiusはそのままカメラの半径です。
カメラが障害物にぶつからない位置に配置されます。
なるべく低い値を設定したほうがクオリティが上がるようです。

f:id:halya_11:20190702002302p:plain

最後にSmoothing Timeです。
これは対象が障害物に隠れたあと、再び見える位置に現れてからカメラの補正が解かれるまでの時間を示します。

f:id:halya_11:20190702002452p:plain

処理負荷に注意

この機能は衝突判定を行うため、処理負荷は決して低くないです。
たとえば複雑な壁に複雑な形状のコライダーを設定してしまったりしたら大変です。

そのため処理負荷が高すぎるようなら違う実現方法を探ることが推奨されています。

参考

docs.unity3d.com