【Unity】【Cinemachine】Clear Shotで対象が障害物に隠れないカメラに自動的に切り替える

CinemachineでClear Shotを使って対象が障害物に隠れないカメラに自動的に切り替える方法をまとめました。

Unity2018.4.0
Cinemachine2.2.9

はじめに

この記事ではCinemachineのClear Shotという機能について説明します。

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

light11.hatenadiary.com

Clear Shotで実現できること

CinemachineのClear ShotはCinemachineで複数のVirtual Cameraをまとめて
一つのVirtual Cameraのように振舞わせるManager Cameraという機能の一つです。

Clear Shotを使うと対象が障害物に隠れた時に、いい感じに映せる別のカメラに切り替えるカメラワークを実装できます。

f:id:halya_11:20190707004204g:plain

Clear Shotは衝突判定のためにCinemachine Colliderの機能を使っています。
この機能については次の記事で説明しているので必要に応じて参照してください。

light11.hatenadiary.com

Clear Shotの使い方

Clear Shotを使うにはまず上部メニューからCinemachine > Create ClearShot Cameraを選択します。

f:id:halya_11:20190707002252p:plain

するとHierarchyにClear ShotのGame Objectとその子にVirtual Cameraが一つ作られます。
Virtual Cameraは必要なだけ複製し、それぞれ位置やターゲットを設定しておきます。

f:id:halya_11:20190707002449p:plain

設定出来たら子のVirtual CameraすべてにCinemachine Colliderをアタッチし、
そのコンポーネントのAvoid Obstaclesにチェックを入れておきます。

f:id:halya_11:20190707002515p:plain

Cinemachine Colliderの細かい設定については次の記事を参照してください。

light11.hatenadiary.com

これでひとまず、あるカメラの対象が障害物に隠れたら別のカメラに切り替わるようになります。

f:id:halya_11:20190707003705g:plain

ついでにカメラの切り替え時にアニメーションするように設定しておきます。
これはCinemachine Clear ShotのDefault Blendから指定できます。
アニメーションさせるにはEase In Outとかにして秒数を指定しておきます。

f:id:halya_11:20190707003940p:plain

これでカメラが切り替わるときにアニメーションするようになりました。

f:id:halya_11:20190707004204g:plain

ちなみにCustom Blendsを使うともっと細かく遷移を指定することもできます。
これについては次の記事を参照してください。

light11.hatenadiary.com

どのカメラが選択されるか

さてClear Shotではあるカメラが障害物により対象を映せなくなると他のカメラに遷移するわけですが、
遷移先のカメラの候補(つまり障害物の影響を受けないカメラ)が複数あった場合はどれが選ばれるのでしょうか。

このようなケースではカメラのPriorityと並び順が使われます。

f:id:halya_11:20190707012159p:plain

まず優先されるのがPriorityです。
対象が見えているカメラの中で最もPriorityの高いカメラが選択されます。

f:id:halya_11:20190707012325p:plain

その上で、もしPriorityが同じカメラがある場合には並び順がより上にあるカメラが選択されます。

f:id:halya_11:20190707012436p:plain

ちなみにRandom Choiceにチェックを入れるとPriorityが同じときに並び順ではなくランダムで選択されるようです。

f:id:halya_11:20190707012850p:plain

ColliderをClear ShotのGameObjectにつければ子につけなくてもよい

上述の手順ではすべての子Virtual CameraにCinemachine Colliderをアタッチしています。
もしすべてのCinemachine Colliderの設定が同じでよければ、
Cinemachine ColliderはClear ShotのGame Objectに一つだけアタッチすればOKです。

f:id:halya_11:20190707013330p:plain

こうするとすべての子Virtual CameraにこのColliderがアタッチされたのと同様の挙動になります。

関連

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com

参考

docs.unity3d.com

docs.unity3d.com