【Unity】【Cinemachine】Virtual CameraのTracked Dollyでパスに沿ってカメラを動かす

CinemachineのVirtual CameraのTracked Dollyの使い方をまとめました。

Unity2018.4.0
Cinemachine2.2.9

はじめに

この記事では、CinemachineのVirtual CameraのBodyをTracked Dollyに設定した時のモードについて説明します。

f:id:halya_11:20190627172108p:plain

最終的にパス上をカメラが動くようなカメラワークを作ります。

f:id:halya_11:20190627172802g:plain

また説明の便宜上、AimはComposerにして常にキャラの方向を向かせておきます。

f:id:halya_11:20190627125408p:plain

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

light11.hatenadiary.com

Cinemachine Pathでパスを引く

さてパス上にカメラを配置するには何はともあれまずはパスを作らなければなりません。
パスを引くには空のGameObjectにCinemachine Pathコンポーネントをアタッチします。

f:id:halya_11:20190627173017p:plain

このコンポーネントベジェ曲線でパスを引くことができます。
Add a waypoint to the pathをクリックしてWaypointを追加していきます。

f:id:halya_11:20190627173854p:plain

アンカーポイントとハンドルで曲線を作っていく、まあ普通のベジェ曲線です。

Cinemachine Smooth Pathを使えば簡単にパスが引ける

前節のパスの引き方は細かい調整が効きますが、めんどくさいです。
そこで代わりにCinemachine Smooth Pathというコンポーネントを使うと、
Waypointを作っていくだけで間をいい感じに補間してくれます。

f:id:halya_11:20190627174241p:plain

これ、実際使ってみるとなかなか感動します。便利。

Virtual Cameraにパスをセットする

さてパスを作ったらあとはVirtual Cameraにそれをセットするだけです。
BodyをTracked DollyにしてPathに先ほどのパスをセットします。

f:id:halya_11:20190627174733p:plain

あとはPath Positionの値をいじればカメラがパス上を移動します。

f:id:halya_11:20190627172802g:plain

このとき、Path Positionの単位をPosition Unitsで設定できます。
これにより例えば「Position = 1と入力した時、その1という値が何を指すか」ということを決められます。

f:id:halya_11:20190627175020p:plain

それぞれの説明は下記の通りです。

名前 説明
Path Units アンカーポイントを単位の基準とする
最初のアンカーポイントを0、2個目のアンカーポイントを1とする。以降同様
Distance 距離を単位の基準とする
Normalized パスの最初を0、最後を1とする

スクリプトからPositionをセットする

スクリプトからパスのPositionを動かすにはちょっと変わった方法を使います。

using Cinemachine;
using UnityEngine;

public class Example : MonoBehaviour
{
    [SerializeField]
    private CinemachineVirtualCamera _virtualCamera;
    [SerializeField]
    private float _position;

    private CinemachineTrackedDolly _dolly;

    void Start()
    {
        // Virtual Cameraに対してGetCinemachineComponentでCinemachineTrackedDollyを取得する
        // GetComponentではなくGetCinemachineComponentなので注意
        _dolly = _virtualCamera.GetCinemachineComponent<CinemachineTrackedDolly>();
    }

    void Update()
    {
        // パスの位置を更新する
        // 代入して良いのか不安になる変数名だけどこれでOK
        _dolly.m_PathPosition = _position;
    }
}

ポイントはいくつかありますが、ソースコードのコメントに記載しました。

自動的にパス上を移動してくれるAuto Dolly

Tracked Dollyにはもう一つ、Auto Dollyという機能があります。
これにチェックを入れると、対象との位置関係を計算してパス上をカメラが自動的に移動してくれます。

f:id:halya_11:20190627180618p:plain

動作はこんな感じです。

f:id:halya_11:20190627180854g:plain

関連

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com

参考

docs.unity3d.com