[#Unity][#Cinemachine]Timelineよりもお手軽に強力にカメラワークを作る、CinemachineBlendListCameraの使い方とハマリポイントについて

# 概要

Unityでカメラの動きを制御するとき、Cinemachineは強力な選択肢の一つです。
特にTimelineと組み合わせた時、VirtualCameraをTimelineに配置していくだけでカメラワークを作ることが出来ますが、
数個のVirtualCameraをBlendしたいだけなのに…と言ったときに、Timelineよりお手軽に、使い方によってはTimelineよりも強力にカメラワークを構築することが出来る、CinemachineBlendListCameraコンポーネントの使い方と、ハマリポイントについて記します。

### Cinemachineってなに？という方は
https://www.youtube.com/watch?v=Pag1KcVWKMc

こちらの動画や記事を参考にください。

## 動作環境
Unity2021.3.5f1
Cinemachine2.8.6
PackageManagerからCinemachineをインストールしておいてください。

## セットアップ
MainCameraにCinemachineBrainをアタッチし、
Hierarchyを右クリックから、BlendListCameraを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/0d976f72-586e-4ee9-446f-61de3bb3313f.png)
今回はサンプル用に真ん中にキューブが置かれたシーンを構築しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/18192302-8531-1972-10ff-ca6885351e80.png)

## CinemachineBlendListCameraコンポーネントについて
インスペクターで見てみると、BlendListCameraの子になっているVirtualCameraが2つインスペクター上で見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/97f218d1-c382-f456-4ecb-6004386afd07.png)
エディタを再生すると、自動的に2つのVirtualCameraをブレンドしていることがわかります。
![icon.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/88370af9-ad95-15b2-c269-c57cc745d1b2.gif)

CinemachineBlendListCameraコンポーネントは、子になっている複数のVirtualCameraを、
* 何秒でどのようにBlendするのか
* そのVirtualCameraに切り替わった後どれだけ保持するか

を親のコンポーネントで決めることができます。
さらに、Followや、LookAt、ExtensionsといったVirtualCameraのパラメータのデフォルトの値を決めることが出来ます。
（子のVirtualCameraでFollowなどのパラメータをセットした場合はその値が優先して参照されるようです。）

### VirtualCameraを追加し、カメラワークを作ってみる
使い方によってはTimelineよりも便利に強力に使えるポテンシャルがあるBlendListCameraを実際に動かしてみましょう。
まずはBlendListCameraの子のVirtualCameraを複製します。名前もリネームしておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/3e95701c-3818-1ce2-ff99-27688b3a4174.png)

そしてBlendListCameraのインスペクターを見ると、下部のリストに複製したVCamが追加されてるのが確認できます。
その後、その上部のリストの＋ボタンを押し、追加された要素の名前を複製したVCamに切り替えてください。
![blendlistcam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/dd8cfbd8-d5be-2291-3295-b2ae72ddf265.png)

その後、CM vcam3のPriorityを一時的にあげ、CM vcam3の位置や向きを好きなように変えてみましょう。
さらに先ほどのBlend inのモードなども変更し、Blend時間も変えてみましょう。
自分はこのように設定してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/f64657eb-6180-81c3-9730-5bcc95cc4068.png)

実行してみると、もともとのカメラの動きに加え、最後に自分が設定したカメラの位置にブレンドされているのが確認できます。
![vcam3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/57658d45-5223-7472-0b6d-4560d93a6d66.gif)

これで基本的な使い方はわかったかと思います。

### CinemachineBlendListCameraのハマリポイント
ここで、こちらの強力なコンポーネントのハマリポイントについてご紹介します。
先ほど設定したCinemachineBlendListCameraのインスペクターで、"CM VCam2"をドラッグし、一番上に持って行ってみてください。
すると、インスペクターの表示はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/b3d2d055-e2b8-bd12-ec8e-dd80a80d9e8f.png)
このインスペクターを見て期待する挙動として、
 > 「CM vcam2からHold0秒で(つまり一瞬で)CM vcam1にブレンドし、ブレンドモードがCutなのですぐに切り替わり始め、1秒待機したのち、CM vcam3にブレンドモードHardOutで1.2秒かけてブレンドする。」

といったものになるかと思います。
ですが再生してみると以下のGIFで示す通り、最初にすぐにCM vcam1に切り替わるはずが、不自然に待つ時間が発生しています。これはインスペクター上から期待できる挙動ではありません。
![vcam3err.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/70678c1e-84ab-fa4f-d657-9e8f74824a85.gif)
なんとなくお察しの方もいらっしゃるかもしれませんが、原因はもともとCM vcam2に対して設定されていたBlend時間が、インスペクター上では非表示になったにも関わらず、パラメータとして使われてしまっているのが問題です。
これは、インスペクターをDebug表示にし、当該のリストの要素をチェックすることでも確認できます。
![cinedebg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/836fa4aa-a2a3-feef-4d9e-01ef68c46a3a.png)
これを解決するには、
 * 一時的にリストの2番目などの要素にし、ブレンドモードをCutにする
 * DebugモードからブレンドモードをCutにする

の2通りの解決方法があります。

とにかく一番最初の要素のVirtualCameraのBlendモードとBlend時間は非表示になるにも関わらず、そのBlend時間分待機してしまうので、Cutにしておかなければならない、というハマリポイントのご紹介でした。

# まとめ

Timelineを使わなくても複雑なカメラワークをつけることができるようになる、
CinemachineBlendListCameraについて、簡単な使い方とハマリポイントをご紹介しました。
ぜひこのコンポーネントを使ってかっこいいカメラワークを制作してみてください。