Cinemachine 3入門!プレイヤーを追いかけるカメラを作ろう

ゲームを作っていると、プレイヤーを追いかけるカメラが欲しくなります。でもカメラの動きを自分でプログラムすると、ガクガクしたり壁にめり込んだりで意外と大変・・・そんなときに使いたいのがCinemachine!Unity6.3 LTSではCinemachine 3が使われていて、以前のバージョンから名前やメニューがかなり変わっています。今回はCinemachine 3でプレイヤーを追いかけるカメラを作るところから、カメラの切り替えまでやってみたいと思います。

目次

Cinemachineでどんなことが出来る?

  • プログラムなしで、プレイヤーを追いかけるカメラが作れる
  • 追いかけるときの遅れ(ダンピング)や、画面のどこに映すかをインスペクターで調整出来る
  • 複数のカメラをなめらかに切り替えられる
  • 手ブレやカメラシェイクなどの演出も簡単に足せる

くっそ個人的な意見ですが、Unityでゲームを作るならCinemachineはほぼ必須だと思っています。

プロジェクトの確認

  • Unityのバージョンは6.3 LTS
  • テンプレートは3D(Universal 3D)
  • Cinemachineのバージョンは3.x
    • 記事作成時点ではCinemachine 3.1系でした。バージョンが違うと、項目の名前が少し違うかもしれません

プレイヤーは動かせるものなら何でもOKです。

Cinemachineを導入しよう

パッケージマネージャーからCinemachineをインストールします。

  • Window>Package Manager
  • 左側のUnity Registryを選択
  • Cinemachineを探してInstall
Package ManagerのUnity RegistryでCinemachineを選んだ画面。バージョンは3.1.7で、Installボタンがある
スライム

Unity6.3でインストールすると3.xが入ります。古い記事に出てくる「Virtual Camera」はCinemachine 2の名前なので、メニューを探しても見つからないです・・・

プレイヤーを追いかけるカメラを作るッ!

Cinemachine Cameraを追加

GameObject>Cinemachine>Cinemachine Cameraを選びます。

  • HierarchyにCinemachineCameraが追加される
  • Main CameraにCinemachine Brainコンポーネントが自動で追加される

Cinemachine Brainは「今どのCinemachine Cameraを使うか」を決める役割です。Main Camera自体は、Cinemachine Cameraの位置と向きに合わせて動くようになります。

Main CameraのInspectorに、Cinemachine Brainコンポーネントが追加されている

追いかける対象をセット

CinemachineCameraを選択して、インスペクターのTracking Targetにプレイヤーをドラッグ&ドロップします。

  • Tracking Target:プレイヤー

これで「誰を追いかけるか」が決まりました。

追いかけ方を決める:Position Control

Cinemachine Cameraの動き方は、Position Control(位置)とRotation Control(向き)の2つで決めます。まずは位置から。

  • Position Control:Follow

追加されたCinemachine Followコンポーネントを下記のように設定します。

  • Binding Mode:World Space
  • Follow Offset:X 0 / Y 5 / Z -8
  • Position Damping:X 1 / Y 1 / Z 1

Follow Offsetはプレイヤーから見たカメラの位置です。Y(高さ)とZ(後ろにどれぐらい離れるか)を変えると、見え方が変わります。

Position Dampingは追いかけるときの遅れで、0にするとピッタリくっつき、大きくするとゆっくり追いかけます。

CinemachineCameraのInspector。Tracking TargetにPlayer、Position ControlにFollow、Cinemachine FollowはWorld Space・Damping 1/1/1・Offset 0/5/-8

ちなみにBinding ModeをLock To Targetにすると、プレイヤーが振り向いたときにカメラも背中側に回り込みます。見下ろし型ならWorld Space、TPSっぽくしたいならLock To Targetがオススメです。

向きを決める:Rotation Control

次はカメラの向きです。

  • Rotation Control:Rotation Composer

これでカメラが常にプレイヤーの方を向くようになります。Cinemachine Rotation Composerの設定で、画面のどこにプレイヤーを映すかを調整出来ます。

  • Dead Zone:この範囲の中でプレイヤーが動いてもカメラは向きを変えない
    • 最初はチェックが外れているので、チェックを入れてSizeを0.2ぐらいにする
  • Damping:向きを変えるときの遅れ
  • Target Offset:Yを1.5ぐらいにすると、足元ではなく体の中心あたりを見るようになる
Rotation ControlをRotation Composerにして、Dead Zoneにチェックを入れた状態。GameビューにDead Zoneの枠が表示されている

再生してプレイヤーを動かしてみてください。カメラがいい感じに追いかけてくれたら成功!

プレイヤーが向きを変えながら歩き、カメラが少し遅れて追いかける様子

手ブレっぽい揺れを足す

カメラがピタッと止まっていると、ちょっと機械っぽく見えることがあります。Noiseを使うと、手持ちカメラのような揺れを足せます。

  • Noise:Basic Multi Channel Perlin
  • Noise Profile:Handheld_normal_mild
  • Amplitude Gain:1
  • Frequency Gain:1

揺れが強すぎると感じたら、Amplitude Gainを下げてください。ダメージを受けたときにだけ揺らしたい場合は、カメラが揺れる処理を実装する記事で紹介しているImpulseの方が向いています。

NoiseをBasic Multi Channel Perlinにして、Noise ProfileにHandheld_normal_mildを入れた状態

カメラを切り替えてみよう

Cinemachineの便利なところは、カメラの切り替えがなめらかなところです。ボタンを押したら寄りのカメラに切り替わるようにしてみましょう。

2つ目のカメラを用意

CinemachineCameraを複製して、名前をZoomCameraにします。

  • Follow Offset:X 0 / Y 2 / Z -3(プレイヤーに近づける)
  • Priority:チェックを入れて0

1つ目のCinemachineCameraも、Priorityにチェックを入れて10にしておきます。Cinemachine Brainは、Priorityが一番大きいカメラを使います。

スライム

Priorityは左のチェックを入れないと数字が入れられないです。チェックが外れているときは0として扱われます!

切り替えのスクリプト

下記スクリプトを作成して、空のゲームオブジェクトに追加してください。InputSystemはUnity6でInputSystemを使うチュートリアルで作ったInputSystem_Actionsを使っています。

using Unity.Cinemachine;
using UnityEngine;

public class CameraSwitcher : MonoBehaviour
{
    [SerializeField] private CinemachineCamera zoomCamera;

    private InputSystem_Actions inputActions;
    private bool isZoom;

    private void Awake()
    {
        inputActions = new InputSystem_Actions();
    }

    private void OnEnable()
    {
        inputActions.Enable();
    }

    private void OnDisable()
    {
        inputActions.Disable();
    }

    private void Update()
    {
        if (inputActions.Player.Interact.WasPressedThisFrame())
        {
            isZoom = !isZoom;
            // 通常カメラ(10)より大きくすると、こちらのカメラに切り替わる
            zoomCamera.Priority.Value = isZoom ? 20 : 0;
        }
    }
}

インスペクターでZoom CameraにZoomCameraをセットします。

スクリプトのポイントをいくつか補足

  • usingはUnity.Cinemachine
    • Cinemachine 3から名前空間が変わりました。古い記事の using Cinemachine; ではエラーになります
  • Priorityを変えるだけで切り替わる
    • どのカメラを使うかはCinemachine Brainが勝手に判断してくれるので、スクリプトでMain Cameraを動かす必要はありません

再生してEキーを押すと、カメラがスーッと寄っていくはずです。

ZoomCameraに切り替わってスーッと寄り、元のカメラに戻る様子

切り替えの速さを変える

切り替えの速さはMain CameraのCinemachine Brainで設定出来ます。

  • Default Blend:Ease In Out
  • Default Blendの右の数値:切り替えにかかる秒数(0.5ぐらいにするとキビキビ切り替わる)

Cutにすると一瞬で切り替わります。

フェアリー

「このカメラからこのカメラの時だけ速く」みたいな細かい指定は、Custom Blendsで出来ますよ!

2Dゲームの場合

2Dの見下ろし型やサイドビューのゲームでは、少し設定が変わります。

  • Main CameraのProjectionがOrthographicになっていることを確認
  • Position Control:Position Composer
  • Rotation Control:なし

Position Composerは、画面のどこにプレイヤーを映すかで位置を決めるコンポーネントです。Dead Zoneを少し広げておくと、プレイヤーが少し動いただけでは画面が揺れなくなります。

カメラがマップの外を映さないようにしたいときは、CinemachineCameraのAdd ExtensionからCinemachine Confiner 2Dを追加して、マップの範囲をPolygon Collider 2Dで指定します。

左はSceneビュー(黄色い枠がマップの範囲、白い枠がカメラの映す範囲で、マップの角で止まっている)。右はPosition ComposerとCinemachine Confiner 2Dを設定したInspector

Cinemachine 2から移行するときの名前の違い

古い記事や古いプロジェクトを見ながら作業するときは、下の表で読み替えてください。

Cinemachine 2Cinemachine 3(Unity6.3)
CinemachineVirtualCameraCinemachineCamera
FollowTracking Target
TransposerCinemachine Follow
Framing TransposerCinemachine Position Composer
ComposerCinemachine Rotation Composer
POVCinemachine Pan Tilt
FreeLook CameraCinemachine Camera + Orbital Follow
using Cinemachine;using Unity.Cinemachine;

あとがき

Cinemachine 3になって名前は変わりましたが、「Tracking Targetで誰を追いかけるか決めて、Position ControlとRotation Controlで動き方を決める」と覚えておけば迷わないと思います。今後のゲーム制作の記事でも、カメラは基本Cinemachineで作っていく予定です。

スライム

設定できる項目が多すぎて、全部覚えるのは無理・・・

フェアリー

最初はFollowとRotation Composerだけで十分!慣れてきたら少しずつ触ってみてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次