Unity 6 入門チュートリアル:Cinemachineでゲームのカメラを自由に動かそう!

広告

対象:Unity 6 / Cinemachine 3.x / C#初学者向け

Unityには、ゲームのカメラ操作を簡単に実現できる Cinemachine(シネマシン) という公式パッケージがあります。

通常、カメラをプログラムで動かすには、プレイヤーの位置を取得し、カメラの位置や角度を計算する必要があります。

しかし、Cinemachineを使えば、Inspectorで設定するだけでプレイヤーを追いかけるカメラや、映画のように視点を切り替える演出を作れます。

移動前と移動後のプレイヤーとカメラを並べ、カメラがプレイヤーに追従する様子を示した概念図。
Cinemachineを使うと、プレイヤーの移動に合わせてカメラを追従させられます。この図は、カメラの位置が追従する様子を示した概念図です。

今回は3Dゲームを題材に、次の機能を段階的に学びます。

  • STEP 1:Cinemachineをインストールする
  • STEP 2:プレイヤーを追いかけるカメラを作る
  • STEP 3:カメラの追従速度や位置を調整する
  • STEP 4:2台のカメラを滑らかに切り替える
  • STEP 5:C#スクリプトでカメラを切り替える
  • 発展:Timelineを使って映画のような演出を作る

1. Cinemachineの仕組み

最初に理解しておきたいのは、Cinemachine CameraとMain Cameraの役割の違いです。

2台のCinemachine Cameraの状態を、Main Camera上のCinemachine Brainが選択・ブレンドし、Cameraコンポーネントへ反映する構成図。
Cinemachine Cameraは位置・向き・レンズの状態を作ります。Main Cameraに追加したBrainが状態を選択・ブレンドし、実際のCameraが映像を描画します。
要素役割
Main Camera実際のゲーム画面を描画する
Cinemachine Brain使用するカメラを決定し、切り替えを処理する
Cinemachine Camera追従対象、位置、角度などを設定する

基本的に、複数のCinemachine Cameraを作っても、実際の描画に使うMain Cameraは1台で構いません。追従カメラの作り方、カメラの切り替えと遷移

2. Cinemachineをインストールする(STEP 1)

Unity 6で新しい3Dプロジェクトを作成してください。

次の順に操作します。

  1. Window → Package Management → Package Manager を開く
  2. パッケージの一覧を Unity Registry に切り替える
  3. Cinemachine を検索する
  4. Install を押す
Package ManagerでCinemachineを検索してインストールする3ステップの概念図
UI概念図(実画面ではありません)。Package ManagerでUnity Registryを選び、Cinemachineを検索してInstallします。メニュー名や配置はUnityのバージョンで異なります。

インストール後は、GameObject → Cinemachine にカメラ作成用のメニューが表示されます。

Unity 6ではCinemachine 3.xを使用する構成を想定します。古いCinemachine 2.xのチュートリアルとはメニュー名やInspectorが異なります。Unity公式マニュアル

3. プレイヤーを用意する

最初は複雑なキャラクターを使わず、Capsuleをプレイヤーの代わりにします。

GameObject → 3D Object → Capsule

名前を Player に変更します。

Transformの位置は次のように設定します。

オブジェクトPositionScale
Player(0, 1, 0)(1, 1, 1)
Plane(床)(0, 0, 0)(5, 1, 5)

Capsuleの下端が床と接する状態になります。

次に、プレイヤーを自動で左右に動かすスクリプトを作成します。

AutoMove.cs

using UnityEngine;

public class AutoMove : MonoBehaviour
{
    [SerializeField]
    private float speed = 2f;

    [SerializeField]
    private float distance = 5f;

    private Vector3 startPosition;

    private void Start()
    {
        startPosition = transform.position;
    }

    private void Update()
    {
        float x = Mathf.PingPong(
            Time.time * speed,
            distance * 2f
        ) - distance;

        transform.position =
            startPosition + Vector3.right * x;
    }
}

このスクリプトをPlayerに追加します。

再生すると、Playerが左右を往復します。ここで使用しているのはtransform.positionを直接変更するシンプルな教材用の移動であり、物理演算による移動ではありません。

4. プレイヤーを追いかけるカメラを作る(STEP 2)

GameObject → Cinemachine → Targeted Cameras → Follow Camera を選びます。

作成されたオブジェクトを CM_FollowCamera に変更します。

Inspectorで次の設定をします。

項目設定
Tracking TargetPlayer
Position ControlFollow
Rotation ControlRotation Composer

Follow Cameraを使って作成した場合、Position ControlやRotation Controlは初期設定済みの場合があります。

Unity公式でも、Follow Cameraは追従対象をTracking Targetに指定して使用する方法として案内されています。追従カメラの作り方、Cinemachine Cameraの公式マニュアル

Follow Cameraを作成すると、Rotation Controlには Rotation Composer が設定されます。Rotation Composerは、Tracking Targetが画面内の狙った位置に映るように、カメラの向きを自動で調整する部品です。

通常、Cinemachine Cameraを作成するとMain Cameraに Cinemachine Brain が追加されます。念のため、Main CameraのInspectorで追加されていることを確認してください。

Tracking TargetをPlayer、Position ControlをFollow、Rotation ControlをRotation Composerに設定し、Follow OffsetとPosition Dampingを指定したUI概念図。
UI概念図(実画面ではありません)。Followで位置を追従し、Rotation Composerで向きを調整する設定例です。Follow Offsetは(0, 3, -6)、Position Dampingは各軸1。数値は推奨値や初期値ではなく練習用の例です。

カメラの位置を調整する

FollowコンポーネントのFollow Offsetを、まず次のようにしてみてください。

X = 0
Y = 3
Z = -6

これはPlayerを基準にしたカメラ位置のずれを表します。対象の回転やFollowのBinding Modeによって実際の配置方向は変わるため、今回はPlayerの回転を変更せずに試します。

再生すると、Playerが動くのに合わせてカメラも追いかけます。

5. カメラの追従を滑らかにする(STEP 3)

Cinemachineの大きな特徴が Damping(ダンピング) です。

Dampingは、カメラが目標にどのくらい滑らかに追いつくかを調整します。

Cinemachine 3.xでは、位置の追従は Position Damping(X・Y・Zの3軸)で調整します。カメラとプレイヤーの基本的な距離はFollow Offsetで決め、Position Dampingは「追従の反応の速さ」を決める値です。向きの追従を調整するRotation Composerにも別のDampingがあります。

Dampingが小さい

カメラが素早く追従する

同じ移動・同じ時点において、Position Dampingが小さいカメラは目標位置に素早く追いつき、遅れが小さいことを示す概念図。
Position Dampingが小さいと、カメラは目標位置に素早く追従します。0.2は比較用の設定例。距離や経過時間は模式表現です。

Dampingが大きい

カメラが遅れて滑らかに追従する

05と同じ移動・同じ時点において、Position Dampingが大きいカメラは目標位置へゆっくり追従し、遅れが大きいことを示す概念図。
Position Dampingが大きいと、カメラは目標位置へゆっくり追従します。3は比較用の設定例。Damping値と画面上の距離の比例関係を示しているわけではありません。

FollowコンポーネントのPosition Dampingを変更し、違いを比較してみましょう。

最初は0.2、1、3などに変更して比較すると、動きの違いを理解しやすくなります。

操作して確認:Position Damping

次のデモで、Position Dampingの値による追従の遅れを模式的に確かめられます。スライダーを0〜3の範囲で動かし、0.2、1、3付近で、青い対象とオレンジのカメラ枠の動きを比べてみましょう。これは理解を助ける模式図であり、Unity内部の計算そのものではありません。実際の動きはUnityで確認してください。

Position Damping:追従の遅れの模式図

Position Dampingの値を変えて、カメラ枠が対象に追いつくまでの遅れを比べます。Unityの実際の動作を厳密に再現したものではありません。

青:対象 橙:カメラ枠

6. 2台目のカメラを作る(STEP 4)

次は、2つのカメラを切り替える演出を作ります。

1台目の CM_FollowCamera を複製し、名前を CM_SideCamera にします。

2台目もTracking TargetはPlayerに設定し、Follow Offsetを変えます。

設定1台目2台目
名前CM_FollowCameraCM_SideCamera
Tracking TargetPlayerPlayer
Follow Offset(0, 3, -6)(6, 3, 0)
Position Damping11

これで、背後からの視点と横方向からの視点ができます。

まず CM_SideCamera のGameObjectを非アクティブにしておきます。

カメラの切り替えを滑らかにする

Main Camera のInspectorで Cinemachine Brain を確認してください。

次のように設定します。

  • Default Blend:Ease In Out
  • Time:1秒

この設定により、カメラを切り替えたときに1秒間かけて滑らかに視点が移動します。CinemachineのBlendは画面のフェードではなく、カメラ位置や向きなどを補間する仕組みです。カメラの切り替えと遷移、Cinemachine Brain

切り替えるカメラは、GameObjectの有効・無効のほかに、Cinemachine Cameraの Priority(優先度) でも決まります。有効なカメラのうちPriorityが最も高いものをBrainが選び、同じ値の場合は最後に有効になったものが選ばれます。

Camera AとBのPriorityを20と10から10と20へ変更し、BrainがAからBへ1秒のブレンドで切り替える概念図。
両方のCinemachine Cameraが有効で同じチャンネルの場合、Priorityを変えるとBrainが採用するカメラが変わります。Default BlendをEase In Out、Timeを1秒にした例です。Timeline等の上書きがない場合を示しています。

7. C#でカメラを自動的に切り替える(STEP 5)

今度は、3秒ごとに視点を切り替えてみましょう。

空のGameObject CameraManager を作り、次のスクリプトを追加します。

CameraSwitcher.cs

using System.Collections;
using UnityEngine;

public class CameraSwitcher : MonoBehaviour
{
    [SerializeField]
    private GameObject cameraA;

    [SerializeField]
    private GameObject cameraB;

    [SerializeField]
    private float interval = 3f;

    private IEnumerator Start()
    {
        if (cameraA == null || cameraB == null)
        {
            Debug.LogError("カメラを設定してください");
            yield break;
        }

        if (cameraA == cameraB)
        {
            Debug.LogError("異なる2台のカメラを設定してください");
            yield break;
        }

        cameraA.SetActive(true);
        cameraB.SetActive(false);

        while (true)
        {
            yield return new WaitForSeconds(interval);

            cameraA.SetActive(false);
            cameraB.SetActive(true);

            yield return new WaitForSeconds(interval);

            cameraB.SetActive(false);
            cameraA.SetActive(true);
        }
    }
}

Inspectorで次のように設定します。

フィールド設定
Camera ACM_FollowCamera
Camera BCM_SideCamera
Interval3

再生すると3秒ごとにカメラが切り替わります。

カメラ切り替えの流れ

経過時間有効なカメラ視点
開始〜3秒Camera A(CM_FollowCamera)背後視点
3秒〜6秒Camera B(CM_SideCamera)横視点
6秒〜Camera Aへ戻る(以後3秒ごとに繰り返し)背後視点

3秒ごとに切り替えを開始。BrainのDefault Blendが1秒なら、通常は切り替え開始から約1秒間で遷移します。

ここで重要なのは、スクリプトが直接Main Cameraの位置を動かしていないことです。

スクリプトは、使用するCinemachine Cameraを切り替えているだけです。実際のカメラ移動はCinemachine Brainが担当します。

なお、今回はGameObjectの有効・無効で切り替えましたが、Priority(優先度)を変更する方法もあります。カメラの切り替えと遷移

8. 発展:Timelineで映画のような演出を作る

Cinemachineは、UnityのTimelineと組み合わせるとさらに便利になります。

例えば、次のようなオープニング演出です。

10秒間のオープニング演出例

時間(例)ショット内容
0〜4秒全景ステージ全体を見せる
4〜7秒接近プレイヤーに近づく
7〜10秒追従通常のゲームカメラ(追従カメラ)に移る

最初にステージ全体を見せ、プレイヤーに近づき、最後に通常のゲームカメラに移る構成です。

作成手順は次のとおりです。

  1. 空のGameObject CutsceneDirector を作る
  2. Window → Sequencing → Timeline を開く
  3. CutsceneDirector を選択してTimelineアセットを作る
  4. Cinemachine Trackを追加する
  5. トラックにMain CameraのCinemachine Brainをバインドする
  6. Cinemachine Shotクリップを配置し、それぞれ使用するCinemachine Cameraを指定する
  7. クリップを重ねると、カメラ間を滑らかに切り替えられる

Timelineによる制御中は、通常のPriorityによるカメラ選択よりTimelineの指定が優先されます。CinemachineとTimeline

9. よくあるトラブル

現象確認すること
カメラが追従しないTracking TargetにPlayerが設定されているか
画面が変わらないMain CameraにCinemachine Brainがあるか
カメラ切り替えが一瞬Default BlendがCutになっていないか
思った位置から映らないFollow Offset、Binding Mode、Rotation Controlを確認
切り替えが動かないスクリプトの参照、GameObjectの有効状態を確認

10. 練習課題

ここまでの内容を定着させるために、次の課題に挑戦してみましょう。

  1. CM_FollowCamera のFollow Offsetを変えて、「高い位置から見下ろす視点」と「低い位置から見上げる視点」を作り、見え方の違いを一言ずつメモする
  2. Position Dampingを0、1、3に変えて再生し、プレイヤーの往復に対するカメラの遅れ方の違いを観察する
  3. Default Blendを Cut に変えて、切り替えが一瞬になることを確認する。確認したら Ease In Out に戻す
  4. 正面から映す3台目のカメラ CM_FrontCamera を追加し、A → B → C → A の順に切り替わるよう CameraSwitcher を改造する
  5. (発展)GameObjectの有効・無効ではなく、Priorityを変更する方法で切り替えを実装する

確認ポイント:スクリプトからMain Cameraの位置を直接動かしていないこと。カメラの動きはすべてCinemachine Brainが担当していること。

まとめ

Cinemachineを使うと、カメラ位置の計算を自分で実装しなくても、さまざまなカメラ演出を作成できます。

今回学んだのは、カメラ追従、Damping、複数カメラの切り替え、ブレンド、そしてTimelineとの連携です。

特に初学者には、Main Cameraは実際に映すカメラ、Cinemachine Cameraは撮影方法を指示するカメラ、という考え方が重要です。

次の発展教材としては、マウスやゲームパッドで視点を回転させるカメラ、壁にめり込まないカメラ、2D横スクロールゲーム用のカメラが適しています。

公式資料:Unity Cinemachine 3.1 マニュアル

※ Unity 6 / Cinemachine 3.xを基準に構成。実際のUnity Editorでの動作確認は未実施です。インストールされたパッケージの版によって、一部のメニュー表示は異なります。

訪問数 13 回, 今日の訪問数 16回

広告

C#

Posted by hidepon