【Unity】複数オブジェクトを画面内に収めるカメラワーク

こじゃら

複数のキャラを画面に収めるにはどうすればいいの~?

このは

Cinemachine Group Composerを使えば簡単だわ!

Cinemachineには複数のオブジェクトを画面内に収めるCinemachine Group Composerという機能があります。これを使うと、次のようなカメラワークを簡単に実装できます。

画面内にオブジェクトを収める動きは、FOVを変えたり(ズームイン/ズームアウト)、カメラ距離を変えたり(ドリーイン/ドリーアウト)して実現します。
この辺りのカメラの動きは自由に調整できるようになっています。

本記事では、Cinemachine Group Composerを使って、複数オブジェクトを画面内に収めるカメラワークを実装する方法について解説していきます。

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

動作環境
  • Unity2021.1.12f1
  • Cinemachine2.7.4

前提条件

Cinemachineパッケージが予めインストールされているものとします。
インストール方法については、以下記事を参考にしてください。

【Unity】三人称視点のカメラワークを簡単に実装する方法
UnityパッケージのCinemachineには、ゲームでよく扱われるカメラワークが用意されています。 CinemachineのFreeLook Cameraを使うと、TPSのような三人称視点のカメラワークを簡単に素早く ...

また、画面に収めたい複数のゲームオブジェクトがシーンに存在しているものとします。

本記事ではSDユニティちゃんを対象にしますが、単純なCudeでも問題ありません。

Cinemachine Group Composerの設定

ここからは、カメラワークを実際に適用していく手順を解説していきます。

Target Group Cameraの配置

ヒエラルキビューの+ボタン(またはGameObjectメニュー)より、Cinemachine > Target Group Cameraの順に選択します。

すると、シーン上にCM vcam1TargetGroup1という名前のゲームオブジェクトが追加されます。

CM vcam1は、対象物を追従する設定がされたバーチャルカメラです。
TargetGroup1は、複数の追従対象を管理するゲームオブジェクトです。

複数の追従対象の設定

追従対象はTargetGroup1にアタッチされているCinemachineTargetGroupコンポーネントのTargetに追加する形で設定します。

必要に応じて各ターゲットのWeightRadiusも調整します。

Weightは、ターゲットの平均位置などを計算する際に使用するウェイト値です。
Radiusは、ターゲットの半径です。この半径の領域を画面に含めるようにカメラワークが調整されます。

参考:Cinemachine Target Group | Cinemachine | 2.6.0

例では、ウェイト値は一緒で、半径を1に設定することにします。

大きなオブジェクトの場合は、オブジェクトが収まるような半径に値を大きく調整すると、画面から見切れなくなります。

バーチャルカメラの位置調整

デフォルトの設定では、カメラは対象物と同じ高さに位置しているため、カメラが床にめり込んでしまう場合があるかもしれません。

例ではCM vcam1CinemachineVirtualCameraコンポーネント > Body > Follow Offset > Yを少し高く設定することにします。

実行結果

ここまで設定を行うと、以下のように対象物が画面に収まるようなカメラワークが有効になります。

動きの調整

ここまでの手順を実施すると、Cinemachine Virtual Cameraには次の初期設定がされた状態になります。

初期設定の内容

Bodyに設定されるTransposerは、ターゲットと一定のオフセットを保ちながらカメラを追従させる動作です。

参考:Transposer | Cinemachine | 2.6.0

Aimに設定されるGroup Composerは、複数ターゲットを画面内に収めながらカメラの照準を合わせる動作です。

参考:Group Composer | Cinemachine | 2.6.0

上記画像の下の赤枠部分(Group Framing Size以降)の項目が、Group Composerの調整項目になります。

Group Composerの調整項目

設定項目については、以下公式リファレンスをご覧ください。

参考:Framing Transposer | Cinemachine | 2.6.0

これら設定項目は、後述するBodyにFraming Transposerが設定された時の内容と一緒なので、Framing Transposerのリファレンスを元にしています。

カメラワークの設定例

ここからは、いくつか主要な設定をピックアップして、対象物を画面内に収めるカメラワークの設定例を紹介します。

ズームイン/ズームアウト

初期設定されている内容です。カメラのFOVを変化させて画面内に対象を収めるようなカメラワークになります。

CinemachineVirtualCamera > Aim > Adjustment ModeZoom Onlyに設定すると有効になります。

Minimum FOVMaximum FOVで画角の最小と最大を設定できます。

ドリーイン/ドリーアウト

カメラを前後移動させて対象物を画面内に収めるようなカメラワークです。

CinemachineVirtualCamera > Aim > Adjustment ModeDolly Onlyに設定します。

Max Dolly InMax Dolly Outにドリーイン/ドリーアウトする最大範囲を、Minimum DistanceMaximum Distanceにはターゲットからの距離の最大・最小を設定できます。

向きを固定する

これまで紹介したカメラワークは、カメラの向きを変えていましたが、向きを変えずカメラ位置とFOVだけ動かすようにすることも可能です。

CinemachineVirtualCameraのBodyFraming Transposerに、AimDo Nothingに設定します。

BodyGroup Framing Mode以降の設定項目は、先述のAimのGroup Composerのそれと意味が同じため、説明は割愛します。

実行すると以下のようなカメラワークになります。

対象をスクリプトから動的に変更する

CinemachineTargetGroupコンポーネントのm_Targetsフィールドに配列で情報を設定します。

参考:Class CinemachineTargetGroup | Package Manager UI website

実際に指定する処理は以下のような形になります。

CinemachineTargetGroup cinemachineTargetGroup;
Transform target1 = null;
Transform target2 = null;
Transform target3 = null;

・・・中略・・・

cinemachineTargetGroup.m_Targets = new CinemachineTargetGroup.Target[]
{
    new CinemachineTargetGroup.Target
    {
        target = target1,
        weight = 1,
        radius = 1,
    },
    new CinemachineTargetGroup.Target
    {
        target = target2,
        weight = 1,
        radius = 1,
    },
    new CinemachineTargetGroup.Target
    {
        target = target3,
        weight = 1,
        radius = 1,
    },
};

さいごに

複数のターゲットを画面内に収めるカメラワークの実装方法について解説しました。
3Dゲームを例にしていましたが、2Dゲームでも同様のことができます。

Cinemachineなしで同様のカメラワークを実装するとなると、FOVや距離などの計算式などを立てながらプログラミングするなどが必要になりますが、Cinemachine Group Composerを用いることでこの辺の動作をノーコーディングで簡単に実装できます。

スクリプトから動的にターゲットを設定したい場合でも、CinemachineTargetGroupに配列を渡すだけなので大きな手間ではないでしょう。

参考サイト