【Unity】Cinemachine Blend List Cameraで切替えシーケンスを作る

次のようにカメラを順番に切替える演出を作りたいの~

Cinemachine Blend List Cameraを使えば手軽に実現できるわ!カメラをシーケンシャルに切り替えたり、ループさせたりできるの。

Cinemachineには、複数のバーチャルカメラを時系列で順番に切り替えるCinemachine Blend List Cameraが存在します。

参考:Cinemachine Blend List Camera | Cinemachine | 2.6.0

バーチャルカメラの切り替えはスクリプトから制御することも可能ですが、決まった順序で切り替えたい場合はCinemachine Blend List Cameraを使うのが便利です。

Cinemachine Blend List Cameraは複数のバーチャルカメラを1つにまとめてグループ化できるため、バーチャルカメラの管理が楽になるというメリットもあります。

本記事では、Cinemachine Blend List Cameraでカメラを順番に切り替える方法について解説します。スクリプトからのアクセス方法についても触れておきます。

この作品はユニティちゃんライセンス条項の元に提供されています

動作環境
  • Unity2021.1.17f1
  • Cinemachine2.7.5

前提条件

事前にCinemachineパッケージがインストールされているものとします。

インストール方法を知りたい方は以下記事を参考にしてください。

【Unity】滑らかに(遅れて)追従するカメラを簡単に実装する方法
Cinemachineを用いてキャラクターを追従するカメラワークを実装する方法の解説記事です。 キャラクターを追従するカメラワークはスクリプトでも実装できますが、Cinemachineを使うことで次のメリットが得られます ...

次のようなシーンを例にとって解説を進めていくこととします。

カメラ切り替えシーケンスの仕組み

カメラの切り替えシーケンスは、次のようなバーチャルカメラブレンド方法表示時間のリストで定義していきます。

シーケンスとして定義されるバーチャルカメラは、Cinemachine Blend List Cameraの子供として管理されます。Cinemachine Blend List Cameraはこれらの子バーチャルカメラの親バーチャルカメラとして振舞います。

一連のシーケンスを実行した後は、初期設定では一番最後のカメラのままになりますが、先頭に戻ってループさせることも可能です。

Cinemachine Blend List Cameraの準備

ここからは、カメラを配置して適用する手順の解説に移ります。

Cinemachine Blend List Cameraの配置

ヒエラルキビューの+ボタン(またはメニューのGameObject)をクリックし、Cinemachine > Blend List Cameraの順に選択します。

すると、シーン上にCinemachine Blend List Cameraが追加されます。この下には2つの子バーチャルカメラが追加された状態になっています。

子バーチャルカメラの配置

ここでは、各キャラクターを正面から映す子バーチャルカメラを3つ配置することとします。

なお、子バーチャルカメラはCinemachineBlendListCameraコンポーネントのVirtual Camera Children項目からも+ボタンで追加したり、ーボタンで削除できます。

切り替えシーケンスの作成

CinemachineBlendListCameraコンポーネントの以下項目から、バーチャルカメラ間の遷移を定義します。

設定項目は次の通りです。

  • Child – 子バーチャルカメラ
  • Blend in – 前の子バーチャルカメラから遷移するときのブレンド曲線と時間(秒)
  • Hold – 子バーチャルカメラに留まる時間(秒)

Blend inに指定するブレンド曲線には、次のような種類があります。

  • Cut – カット割り。一瞬でカメラが切り替わる。
  • Ease In Out – S字カーブの遷移。開始と終了で加減速する。
  • Ease In – 開始は急に動き、終了は緩やかに停止する。
  • Ease Out – 開始は緩やかに動き、終了は急に停止する。
  • Hard In – 開始は緩やかに動き、終了付近で速くなって急停止する。
  • Hard Out – 開始は速く急に動き、終了は緩やかに停止する。
  • Linear – 終始等速で動く。線形補間のブレンド。
  • Custom – カスタムのアニメーションカーブで曲線を定義する。

参考:Enum CinemachineBlendDefinition.Style | Package Manager UI website

例えば、1秒間で遷移し、2秒間留まるシーケンスは次のような設定になります。

実行結果

シーケンスを実行すると、最後のカメラを表示し続ける挙動になります。

シーケンスのループ

CinemachineBlendListCameraコンポーネントのLoop項目にチェックを入れると、シーケンスのループが有効になります。

ループしない場合と比べ、最後のカメラで留まる時間(Hold)と、最後から最初に遷移するブレンド(Blend in)の項目が設定できるようになります。

実行結果

デバッグテキストの表示

CinemachineBlendListCameraコンポーネントのShow Debug Text項目にチェックを入れると、シーケンスの内部状態をデバッグ表示できるようになります。

実行結果

スクリプトから設定情報にアクセスする

Cinemachine Blend List Cameraは、CinemachineBlendListCameraクラスのコンポーネントとして取得できます。

var blendListCamera = vcamObject.GetComponent<CinemachineBlendListCamera>();

参考:Class CinemachineBlendListCamera | Package Manager UI website

本記事ではすべての機能を解説しませんが、主要なプロパティやメソッドを紹介します。

子バーチャルカメラの一覧を取得する

ChildCamerasプロパティから取得できます。

public CinemachineVirtualCameraBase[] ChildCameras { get; }

CinemachineVirtualCameraBase型の配列です。すべての子バーチャルカメラのへの参照が格納されています。

参考:Class CinemachineVirtualCameraBase | Package Manager UI website

現在の子バーチャルカメラをチェックする

シーケンスで現在実行されている子バーチャルカメラは、LiveChildプロパティで取得します。

public ICinemachineCamera LiveChild { get; set; }

また、IsBlendingプロパティから次のカメラにブレンドで遷移中かどうかを取得できます。

public bool IsBlending { get; }

シーケンスの定義情報にアクセスする

m_Instructionsフィールドに定義情報が格納されています。

public CinemachineBlendListCamera.Instruction[] m_Instructions

m_InstructionsはCinemachineBlendListCamera.Instruction型の構造体です。次のような定義になっています。

public struct Instruction
{
    // 子バーチャルカメラ
    public CinemachineVirtualCameraBase m_VirtualCamera;

    // 子バーチャルカメラに留まる時間(秒)
    public float m_Hold;

    // ブレンドの定義
    public CinemachineBlendDefinition m_Blend;
};

参考:Struct CinemachineBlendListCamera.Instruction | Package Manager UI website

CinemachineBlendDefinition型はブレンド情報を格納する構造体です。以下のようなフィールドを持っています(一部省略)。

public struct CinemachineBlendDefinition
{
    // ブレンド曲線の種類
    public enum Style
    {
        Cut,
        EaseInOut,
        EaseIn,
        EaseOut,
        HardIn,
        HardOut,
        Linear,
        Custom
    };
    public Style m_Style;

    // ブレンド時間(秒)
    public float m_Time;

    // Customが指定された場合に使うカスタム曲線
    public AnimationCurve m_CustomCurve;
}

参考:Struct CinemachineBlendDefinition | Package Manager UI website

さいごに

Cinemachine Blend List Cameraを用いることで、手軽にカメラ切り替えのシーケンスを作成することが可能です。

より大規模で複雑なシーケンスを実装したい場合、Timelineでバーチャルカメラのトラックを作成する方法が適しているかもしれません。

参考:Create cutscenes, gameplay sequences and other cinematic content with Unity's Timeline and Cinemachine - Unity

今回紹介したバーチャルカメラ以外にも、複数のバーチャルカメラをグループ管理できるものが存在します。詳細は公式マニュアルをご覧ください。

参考:Virtual Camera の制御とグループ化 | Cinemachine | 2.6.0

参考サイト