はじめに
2D環境でCinemachineを使って以下のことを実現したときのメモです。
- キャラクターに追従するカメラ
- 複数のオブジェクトを画角に納めるカメラ
Unityのカメラのことをよくわかっていなかったので、ついでにそのへんも色々と調べました。また、Cinemachineがインポート済みの2Dプロジェクトであることが前提なので、そのへんの説明は含めていません。
検証を進めるにあたって、以下のキャラクターとステージを用意しました。
Cinemachineざっくり概要
対象を追尾したり、手ブレのような効果を与えたり、特定のパスに沿って移動したりするようなカメラワークを簡単に実現できるアセットです。
Cinemachineは、さまざまなカメラワークを実現するための仕組みとして「Virtual Camera」 というものを提供しています。Virtual Camera は、自身の位置・回転情報と画面を投影するための様々な設定項目から構成されています。
Unityのカメラは、割り当てられている Virtual Cameraの設定に従って画面を投影します。割り当てられている Virtual Camera が変わると、それにあわせてカメラの設定も変化します。異なる設定の Virtual Camera に次々と切り替えることで、様々なカメラワークを実現できます。Virtual Camera間の設定値の違いを、切り替えの際に自動的に補間されるようにもできます。
カメラの投影モードについて
Virtual Cameraの説明に移る前に、カメラの投影モードについて触れておきます。
Unityのカメラには、透視投影(Perspective) と 平行投影(Orthographic) という2種類の投影モードがあります。透視投影は遠近感が考慮されるので、遠くのものは小さく見え、近いものは大きく見えます。正投影は遠近感がありません。ざっくり分類すると、透視投影は3Dのゲーム、平行投影は2Dのゲームで用いられます。
今回は2D環境なので 平行投影(Orthographic) なカメラを用います。Unityプロジェクト作成時に「2D」として作成していればデフォルトで Orthographic となっているはずです。Perspective か Orthographic かは、カメラオブジェクトの Projection Modeパラメータ で確認できます。Sizeの値を調整すれば、描画範囲を設定できます。
Virtual Cameraの作成
ツールバーの Cinemachine > Create 2D Camera をクリックします。すると、Scene上に「CM vcam1」という名前のオブジェクトが作成されます。これが Virtual Camera です。
Cinemachine Brain
Virtual Cameraを作成すると、Main Camera に「Cinemachine Brain」というコンポーネントがアタッチされます。Live Cameraには、割り当てられている Virtual Camera が設定されています。
「Cinemachine Brain」コンポーネントは自分でアタッチすることもできます。Live Cameraの項目は、アクティブなVirtual Cameraが自動的に設定されるようになっています。手動での設定はできません。アクティブなVirtual Cameraがない場合は 「None(Transform)」となります。
Virtual Cameraに紐づいたMain Cameraは、インスペクターからパラメータを変更できなくなります。Virtual Cameraの設定を変更するとMain Cameraに反映されるので、Virtual Cameraの設定を変更しましょう。
Virtual Cameraの設定項目
基本設定、Body、Aim、Noizeの4つに大別できます。
この記事では、今回設定する 基本設定 と Body についてのみ取り扱います。Aimは「Do nothing」のまま、Noiseは「none」のままとしておきます。
Virtual Cameraの基本設定項目
上から3つはデバッグに関する項目です。Game Window Guides と Save During PlayはとりあえずONにしておくと設定が捗ります。追跡カメラをする際に重要なのは、Followパラメータです。
- Status: Live
- Soloをクリックすると、カメラをプレビューできます。
- Game Window Guides
- チェックを入れると、デバッグ実行時にカメラ情報が表示されるようになります。
- Save During Play
- チェックを入れると、デバッグ実行時のパラメータ変更がそのまま保存されるようになります。
- Priority
- カメラの優先度を指定します。
- 複数カメラがある場合に優先度の高いカメラが優先されます。
- Follow
- 追跡対象のTransformを指定します。
- LookAt
- 2Dのカメラワークを正しく動作させるために、Noneのままとしておきます。
- Lens
- Main Cameraと同様にカメラの投影範囲を指定します。
- Dutchはz軸での回転を指定できます。これはVirtual Camera固有の項目です。
Virtual CameraのBodyの設定項目
Bodyでは、Followに設定したTransformに対してどのような挙動をするかを設定します。図のように、Bodyにはいくつか種類があります。
2D環境の場合は、「Framing Transposer」が適しています。「Create 2D Camera」で作成された Virtual Cameraの場合は、デフォルトで「Framing Transposer」になっています。Framing Transposerは、カメラのXY平面の位置情報に関する設定のみ可能で、回転・方向に関する設定はできません。この性質は平面で投影する Orthographic なカメラと相性が良いです。
Framing Transposer のパラメータについて説明していきます。
- Soft Zone Width/Height
- Soft Zone の領域に追跡対象が含まれている場合にカメラが追従します。また、追跡対象がSoft Zoneから出そうになった場合、Soft Zoneから出ないようにカメラが移動します。
- Bias X/Y
- Soft Zone を移動させる設定です。
- Dead Zone Width/Height
- Soft Zoneのうち、カメラが追従しない領域です。Bias X/Y は反映されません。
- Screen X/Y
- カメラの中心点を指定します。デフォルトは 0.5/0.5 でちょうど画面の中心となっています。
- Dumping X/Y/Z
- カメラの追従にディレイをかけられます。値が小さいとすぐに追従し、大きいと反応が鈍くなります。1がデフォルト値ですが、0にすることで一切の遅延がなくなります。
- LookAhead
- 移動方向にカメラが先回りするように動きます。
プレイヤーに追従するカメラのサンプル
作成した Virtual Camera の Follow にキャラクターを指定し、Framing Transposerの設定をしたのが以下のgifです。Framing Transposerは、Soft Zone, Dead Zone, Y Dumping のみを設定しています。
Soft Zone / Dead Zone は、見たままの設定です。Soft Zoneの部分ではカメラが追従し、Dead Zoneの部分ではカメラが追従していないことがわかると思います。
X Damping は 0 なので遅延なくすぐにカメラが追従しています。 Y Damping には 3 を指定しているので、縦方向はカメラが遅れて追従しているのが見てとれます。
こんな感じで、1行もコードを書かずに非常に簡単に追従するカメラが作れました。
複数の対象をいい感じに写すカメラのサンプル
「Cinemachine Target Group」 を使うことで、複数の対象がいい感じに写るように調整されます。新たに3体の敵を追加して、Target Groupに諸々設定すると、以下のような動きになります。
Cinemachine Target Group
ツールバーの Cinemachine > Create Target Group Camera をクリックすると、Virtual Camera と Cinemachine Target Group がアタッチされたゲームオブジェクトがそれぞれ作成されます。すでに Virtual Camera がある場合は、 Cinemachine Target Group を自分でゲームオブジェクトにアタッチすればOKです。
Target のリストに、追従対象とするオブジェクトをすべて設定します。Weight や Radius といったパラメータを調整することで、どの対象をメインに写すか等を調整できます。これだけで複数の対象がいい感じに写るようになります。
おわりに
Unite Tokyo 2018の「Unity 2D機能のアップデートとその周辺」セッションを聴いて「Cinemachineしっかり使っていこう!」と思ったのが使ってみたきっかけでした。
www.slideshare.net
これまでUnityのカメラ操作に関する勉強をサボっていたので色々と勉強になりました。State Driven Camera のことも書こうと思いましたが、力尽きたので別の記事としてまとめました。