CinemachineのCinemachine Colliderを使って、対象が障害物に隠れた時に対象が映る位置に良い感じに移動するカメラを作る方法をまとめます。
Unity2018.4.0
Cinemachine2.2.9
はじめに
この記事ではCinemachineの拡張機能であるCinemachine Colliderについて説明します。
Cinemachineの基本的な使い方やVirtual Cameraの設定方法は本記事では説明しません。
これらは以下の記事にまとめていますので、必要に応じて参照してください。
やりたいこと
いま、障害物によってカメラのLook At対象が隠れてしまうケースを考えます。
このような時にCinemachine Colliderを使うと対象が見える位置にカメラを補正してくれます。
この記事ではこの設定方法を紹介します。
設定手順
Cinemachine ColliderはUnityの衝突判定システムを使います。
そのためこれを使うにはまず障害物にColliderがアタッチされていることを確認します。
次にVirtual Camera最下部のExtensionsからCinemachine Colliderを選択してアタッチします。
Strategyでカメラ位置の補正方法を選択し、切り替わり時間をDampingとして設定します。
今回は下記のように設定しました。
この設定でひとまず次のように障害物をよけるカメラが作れました。
Strategyの種類
Strategyの設定により「障害物に隠れた時にカメラの位置がどう補正されるか」が変わります。
名前 | 説明 |
---|---|
Pull Camera Forward | カメラの前方方向に動かすことで補正 |
Preserve Camera Height | カメラの高さをなるべく変えないように補正 |
Preserve Camera Distance | カメラと対象との距離をなるべく変えないように補正 |
どれを選ぶかはケースバイケースですが、3つだけなのですべて試してみるのが手っ取り早いと思います。
参考までに、後ろに障害物(壁)がある状態でStrategyを変更するとこれだけ見た目に差が出ます。
どのオブジェクトを障害物とみなすか
これまでの設定では、Colliderが設定されているものすべてを障害物とみなします。
特定のLayerのGame Objectのみを障害物とみなすには、Collide Againstにレイヤーを指定します。
ただしIgnore Tagに設定されたタグを持つGame Objectは無視されます。
プレイヤーなどカメラに映している対象にColliderがセットされている場合にはそれらが障害物としてみなされないように除外しておくとよさそうです。
またMinimum Distance From Targetに値を設定すると、対象からその距離以内のものは障害物とみなしません。
つまり対象に近いオブジェクトを障害物にしないための設定です。
その他の細かい設定
最後にその他の細かい設定をざっと説明して終わります。
まずAvoid Obstaclesですが、このチェックを外すとカメラの補正が行われなくなります。
しかし当たり判定計算だけはなされていて、他のコンポーネントと組み合わせて使うための機能のようです。
Distance Limitに値を設定すると、カメラからこの距離までの当たり判定だけを取ります。
0に設定するとカメラから対象の距離まですべて当たり判定を取ります。
Minimum Occlusion Timeに時間を設定すると、対象が隠れてからこの時間が経過してからカメラが補正されます。
Camera Radiusはそのままカメラの半径です。
カメラが障害物にぶつからない位置に配置されます。
なるべく低い値を設定したほうがクオリティが上がるようです。
最後にSmoothing Timeです。
これは対象が障害物に隠れたあと、再び見える位置に現れてからカメラの補正が解かれるまでの時間を示します。
処理負荷に注意
この機能は衝突判定を行うため、処理負荷は決して低くないです。
たとえば複雑な壁に複雑な形状のコライダーを設定してしまったりしたら大変です。
そのため処理負荷が高すぎるようなら違う実現方法を探ることが推奨されています。