2Dの広いマップ上でキャラを歩かせるとき、カメラを追従させたくなってきて…
何か簡単な方法はないの~?
Cinemachineを使えば簡単に実現できるわ!
2Dゲームはもちろん、3Dゲームでの表現力豊かなカメラワークを作るのには打って付けの機能なの。
本記事では、Cinemachineを用い、2Dゲーム上でプレイヤーにカメラを追従させるようなカメラワークを実現する方法をご紹介します。
- Unity2019.4.27
- Cinemachine2.5.0
目次 非表示
Cinemachineとは
Cinemachineは、ゲームの高度なカメラワークをノーコーディングで実現できる新しいカメラ機能です。
細かいカメラの動きの調整が可能で、映像作品を制作したいときにも大いに役立つ事でしょう。
Cinemachineを用いると、以下のようなカメラワークが実現できます。
カメラワークをCinemachineを使って実現してみました
— ねこじゃらシティ@ゲーム制作始めました (@nekojara_city) May 7, 2020
簡単にカメラをキャラクターに追従させることが出来ます♪
カメラの映す範囲を設定できるので、マップの外側が見えないようにすることも可能です!#Unity #unity3d pic.twitter.com/S0bR7D2u4s
早速ですが、本題のカメラワークを実現する手順を見ていきましょう。
導入手順
以下のような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 WidthとDead Zone Heightを0より大きな値に設定すると、動画のように先読みでカメラを移動しつつも、画面中央付近ではキャラが動いてもカメラが動かないようになります。
そのほかの項目に関しても、調整して試行錯誤してみてください。
さいごに
今回は、Cinemachineで2Dゲーム上のプレイヤーにカメラを追従させる方法について解説させていただきました。
しかしながら、プレイヤーがマップの端に移動したときは、マップの外側が見えてしまっています。
マップの外側が見えないように設定する方法については、以下記事をご覧ください。