【Unity】Cinemachineで2Dゲームのプレイヤーにカメラを追従させる

こじゃら
こじゃら

2Dの広いマップ上でキャラを歩かせるとき、カメラを追従させたくなってきて…
何か簡単な方法はないの~?

このは
このは

Cinemachineを使えば簡単に実現できるわ!
2Dゲームはもちろん、3Dゲームでの表現力豊かなカメラワークを作るのには打って付けの機能なの。

本記事では、Cinemachineを用い、2Dゲーム上でプレイヤーにカメラを追従させるようなカメラワークを実現する方法をご紹介します。

Cinemachineとは

Cinemachineは、ゲームの高度なカメラワークをノーコーディングで実現できる新しいカメラ機能です。
細かいカメラの動きの調整が可能で、映像作品を制作したいときにも大いに役立つ事でしょう。

Cinemachineを用いると、以下のようなカメラワークが実現できます。

早速ですが、本題のカメラワークを実現する手順を見ていきましょう。

導入手順

以下のような2Dマップ上でキャラを歩かせるシーンがある事を前提に、Cinemachineでキャラにカメラを追従させる手順を解説していきます。

なお、フィールドマップには次のアセットを使用させていただきました。

また、プレイヤーのグラフィックには次のアセットを使わせていただきました。

Cinemachineパッケージのインポート

メニューの「Window」→「Package Manager」よりパッケージマネージャーを開き、Cinemachineパッケージをプロジェクトにインポートします。

これで、Cinemachineを使用する準備は完了です!

Cinemachineの設定

いよいよCinemachineをシーン上のカメラに設定していきます。
ここではメインカメラをCinemachineの制御対象とします。

CinemachineBrainの追加

CinemachineBrainはCinemachineを司るもので、Cinemachineを動かすために必ず必要になります。
Cinemachineのカメラ制御の統括はCinemachineBrainで行われます。

メインカメラオブジェクト(画像では「Main Camera」)に、「Add Component」ボタンよりCinemachineBrainコンポーネントをアタッチします。

インスペクタからカメラ位置のUpdateタイミングなど細かい設定が可能ですが、今回はこのまま設定を弄らずに行きます。

VirtualCameraの追加

VirtualCameraは、Cinemachineが扱う仮想カメラのことで、Cienamchine内でのカメラのような振る舞いをします。
例えば、複数のVirtualCameraをシーン上に配置して、これらのカメラ位置や向きをブレンドしたり、カメラ切り替えを行ったりすることができます。

今回は、プレイヤーにカメラを追従させたいだけですので、VirtualCameraは1個だけで済みます。

メニューの「Cinemachine」→「Create 2D Camera」を選択し、シーン上に2D用のVirtualCameraを配置します。

VirtualCameraの設定

無事にVirtualCameraを追加出来たら、インスペクタ上の「Follow」にプレイヤーオブジェクトをアタッチしてください。

これでゲームを実行すると、プレイヤーにカメラが追従するようになりました!

こじゃら
こじゃら

ノーコーディングでここまで簡単に出来るのは凄いね!

このは
このは

カメラワークの細かい動きの設定は行っていないけど、追従させるだけなら非常に簡単だわ。
Cinemachineが登場する前はカメラを動かすスクリプトを自分で書かなければいけなかったので大きな進歩ね!

VirtualCameraのインスペクタからは、2D以外にも3D用など様々なシチュエーションのカメラワークに設定できます。しかし、設定項目が多いため「Cinemachine」メニューから用途に合ったテンプレートを選択してシーンにVirtualCameraを配置するのが良いでしょう。

追従するカメラの動きを調整してみる

カメラワークの調整は、VirtualCameraのインスペクタから設定できます。

追従動作の設定項目は、VirtualCameraのBodyに集約されています。

設定項目は公式マニュアルに記載されていますが、現在はすべて英語のため、簡単な説明を記しておきます。

  • Loockahead Time … 対象物の移動時に、進行方向よりどれだけ先読みで注視するか。
  • Lookahead Smooting … Loockahead動作の滑らか度合。数値が大きいほど慣性が大きくなる。
  • Lookahead Ignore Y … このチェックが有効な時は、Y座標の先読みを行わない。
  • X Damping … X軸方向のカメラの動きの慣性。
  • Y Damping … Y軸方向のカメラの動きの慣性。
  • Z Damping … Z軸方向のカメラの動きの慣性。
  • Screen X … X軸方向のスクリーン位置。0.5が中心。
  • Screen Y … Y軸方向のスクリーン位置。0.5が中心。
  • Camera Distance … 対象物とカメラとの距離。
  • Dead Zone Width … カメラが動かない領域の幅。
  • Dead Zone Height … カメラが動かない領域の高さ。
  • Dead Zone Depth … カメラが動かない領域の奥行。
  • Ultimated Soft Zone … このチェックが有効の時は、対象物とカメラとの距離制限を設けない。
  • Soft Zone Width … カメラを緩やかに動かす領域の幅。
  • Soft Zone Height … カメラを緩やかに動かす領域の高さ。
  • Bias X … Soft ZoneのずらしX座標。
  • Bias Y … Soft ZoneのずらしY座標。
  • Center On Activate … このチェックが有効な時は、アクティブ化されたときに対象物が注視点となるようにする。

例えば、Lookahead Timeを0.1にして、Dead Zone WidthDead Zone Heightを0より大きな値に設定すると、動画のように先読みでカメラを移動しつつも、画面中央付近ではキャラが動いてもカメラが動かないようになります。

そのほかの項目に関しても、調整して試行錯誤してみてください。

さいごに

今回は、Cinemachineで2Dゲーム上のプレイヤーにカメラを追従させる方法について解説させていただきました。

しかしながら、プレイヤーがマップの端に移動したときは、マップの外側が見えてしまっています。
マップの外側が見えないようにCinemachine側を設定することも可能ですが、その方法はまたの機会にご紹介させていただきます。

参考サイト