はじめに
Cinemachine は Unity のカメラを操作するためのモジュールです。
バーチャルカメラを用意して動かしておき、カメラオブジェクトに CinemachineBrain をアタッチすることで、カメラに様々なバーチャルカメラの挙動を反映する仕組みです。
複数のバーチャルカメラを用意することで、実質1つのカメラを扱いながらも、複数のカメラを切り替えているかのような見せ方などもできます。
また、基本的な挙動や機能などが複数用意されています。
カットシーンなどでの使用用途もありますが、ゲーム全般で使用できる機能も多くありますので、どのような挙動をさせることができるのかをまとめてみました。
導入・使用方法
- PackageManagerからインストール
- Unityメニュー → Window → Package Manager
- Cinemachine と検索して Install
- Cinemachineコンポーネントを配置
- シーンのHierarchyに配置したカメラに CinemachineBrain コンポーネントを追加
- Unityメニュー → Cinemachine → Create Virtual Camera でバーチャルカメラを追加
- CinemachineBrainが存在しない場合は自動でカメラに追加されます
バーチャルカメラの基本設定と追従設定
バーチャルカメラのパラメータについて
Status
バーチャルカメラが動作しているか・CinemachineBrain に適用されているか、が表示されます。
- Live : CinemachineBrainに適用されている = カメラに適用されている
- Standby : 有効だけれどCinemachineBrainには適用されていない
- 後述の Priority 関連
- Disable : 無効、動作していない
- Editor作業で実行していない状態でも、Solo ボタンを押すと強制的にLive状態にできます。
Game Window Guides
ゲームビューでのガイドの表示切り替え。
Save During Play
Editorで実行中に変更した内容を実行終了後も保持する。
Priority
個別のバーチャルカメラの優先度設定。
複数のバーチャルカメラが存在する場合に、数値が最も大きいバーチャルカメラがCinemachineBrainに適用されます。
Follow
追従するゲームオブジェクトの指定。
Look At
照準を合わせるゲームオブジェクトの指定。
Lens
カメラの基本設定類。
- Field Of View
- カメラのProjectionをOrthographicに設定していた場合、Orthographic Size になります。
- Near Clip Plane
- Far Clip Plane
- Dutch : 横回転
Body
Followに設定したゲームオブジェクトを追従する挙動の設定。
詳細はBody設定で後述します。
Aim
Look Atに設定したゲームオブジェクトに照準を合わせる挙動の設定。
詳細はAim設定で後述します。
Body, Aim の補足
Body, Aim を Do nothing にすることで、移動・回転しないバーチャルカメラにできます。
この場合は、挙動を設定していないだけであって、よそからバーチャルカメラを移動・回転させることが可能です。
バーチャルカメラのBody設定
移動の挙動を複数の設定から選択できます。
Transposer
Followオブジェクトから指定距離を維持して、Damping値で遅延させつつ追従します。
Transposer の BindingMode 種類
Binding Mode でさらに複数の挙動を選択できます。
(各種画像の挙動は、Aim 設定が Do nothing だとカメラがキャラ位置に追従していても回転しないためにキャラが見えなくて分かりにくい挙動になってしまうため、Aim 設定を Composer にして回転するようにしています。)
Lock To Target
Followオブジェクトに対して Follow Offset に指定したローカル座標で一定距離を保って追従します。
(画像ではキャラ後方を指定)
Lock To Target No Roll
Lock To Target 同様に追従しつつ、FollowのZ軸回転を無視します。
Lock To Target With World Up
Lock To Target 同様に追従しつつ、FollowのX軸回転とZ軸回転を無視します。
Lock To Target On Assign
Lock To Target 同様に追従しつつ、Followの回転を無視します。
Followオブジェクトを設定したときや、バーチャルカメラがアクティベートされた時点のFollowの値が適用されるため、キャラモデル内のパーツなど回転が入っているオブジェクトを参照していると意図しない状態になることがあるので、キャラモデルのルートなどを参照させたほうが良い場合があります。
Simple Follow With World Up
Followオブジェクトに対して一定距離を保って追従します。
Lock To Target と異なり、キャラ後方などのローカル座標に依存しません。
World Space
Followオブジェクトを追従しつつ、Followの回転を無視します。
Lock To Target On Assign 同様の挙動ですが、アクティベート時などにFollowの状態に影響されずワールド空間の同じ方向を向き続けます。
(画像では、Dampingを1にしているため追従に遅延がかかっていて、AimのComposer設定でキャラを注視点に指定しているため、少し回転がかかる結果になっています。)
Orbital Transposer
Transposer の挙動に加えて、Follow Offset を反映しつつ、XAxis によりFollowの周囲を回転する挙動を作れます。
デフォルトでは Input Axis Name に Mouse X が設定されていて、マウス操作によって回転させられます。(InputManager ではなく InputSystem を導入している場合はエラーになるので、空欄に修正します。)
Recenter To Target Heading を Enabled にすると、進行方向に対して XAxis を一定時間で戻す挙動になります。
進行方向は Heading で、transform.forward や 前フレームからの移動差分 や rigidbody.velocity を元に求める設定が選択できます。
Framing Transposer
主に2D用途での追従挙動です。(3Dでも使用可能)
後述する Aim の Composer 同様の設定を、回転ではなく移動用のパラメータとして設定できます。
(画像では、赤が SoftZone、赤でも青でも無い空間が DeadZone。黄色い点が Lookahead 設定でキャラ進行方向を予測していて、この点が DeadZone 内に収まるようにカメラが移動します。Damping で遅延させています。)
(Game Windows Guides を有効にして、設定を可視化しています。)
Tracked Dolly
ドリーパス上を移動するカメラです。
(画像の手前緑のラインがドリーパス)
Hard Lock To Target
バーチャルカメラのAim設定
回転の挙動を複数の設定から選択できます。
Composer
Look Atオブジェクトを注視するように回転します。
注視点は Tracked Object Offset で調整します。(画像ではキャラ上部の少し上の黄色い点)
Damping で遅延を設定できます。
Dead Zone は、一定範囲内であれば追従させない範囲です。(画像での赤でも青でもない中央の空白部分)
Soft Zone は、Damping による遅延があった場合でも指定範囲を注視点が出ないようにする設定です。(画像での外側の赤部分)
Screen で Dead Zone と Soft Zone の中心位置を、Bias で Soft Zone の中心位置を調整できます。
(Game Windows Guides を有効にして、設定を可視化しています。)
また、Lookahead ではLook Atオブジェクトの移動先を予測して、進行方向前方に注視点を補正します。(画像の黄色い点が、補正された注視点です。)
前フレームとの移動差分から取得されているため、キャラモデル内のパーツなど常時アニメーションによって動くオブジェクトをLook Atに指定すると、予測が正常に動作しないため、キャラモデルのルートなどを参照させたほうが良いです。
Group Composer
後述の「複数オブジェクトを追従」にある CinemachineTargetGroup で複数オブジェクトを設定し、LookAtに指定することで、複数オブジェクトを画面内に収めるようになります。
Adjustment Mode で、挙動をFOVと距離(Dolly)のどちらを扱うかを設定できます。
Dolly を有効にすると、回転を扱うAim設定にも関わらずカメラ位置が移動するようになります。
(画像ではキャラとCubeが画面内に収まるようにしています。また、Dolly Then Zoom を選択して、FOVと距離の両方で制御させています。)
POV
Vertical Axis と Horizontal Axis のそれぞれの Value を変更して、直接回転を操作します。
それぞれの Input Axis Name にマウス操作が割り当てられているため、マウス操作によって回転させられます。(InputManager ではなく InputSystem を導入している場合はエラーになるので、空欄に修正します。)
Vertical Recentering / Horizontal Recentering を Enabled にすると、各回転を一定時間で 0 に戻す挙動になります。
Hard Look At
Same As Follow Target
Followオブジェクトの向きにカメラ向きを一致させます。
LookAtを設定しても反映されません。
(画像では、Followにキャラを設定しているため、キャラの向き変更に合わせてカメラが回転しています。)
複数オブジェクトを追従
前述の内容で追従させることができるのは単一のオブジェクトですが、複数のオブジェクトを追従させることもできます。
- Unityメニュー → Cinemachine → Create Target Group Camera
から、CinemachineTargetGroup オブジェクトと、このオブジェクトを Follow / Look At に設定したバーチャルカメラが生成されます - CinemachineTargetGroup の設定で、追従対象にしたいオブジェクトと、位置や角度をそれぞれ中心を取るか平均を取るかなどを設定することで、複数のオブジェクトを追従させるバーチャルカメラを設定することができます
(画像では、Body を Transposer の LockToTargetWithWorldUp、Aim を GroupComposer にしています。)
カメラ切り替え
複数のバーチャルカメラを用意して、有効なバーチャルカメラを変更することで、カメラ本体が1つのみであってもカメラを切り替えているかのような挙動をさせることができます。
カメラ本体に適用されるバーチャルカメラについて
アクティブなバーチャルカメラのうち、最もPriorityが大きいバーチャルカメラがLive状態(カメラ本体に反映されている状態)になります。
カメラ切り替えの方法
アクティブ変更によるカメラ切り替え
- アクティブ状態を変更することでカメラ本体に反映するバーチャルカメラが変わると、CinemachineBrainの付いているカメラ本体に自動で対象のバーチャルカメラ設定(位置・回転等)が反映されて、カメラが切り替わる挙動になります
- ただし、非アクティブにしたバーチャルカメラはStatusがDisableになり、追従挙動をしない状態になります
- アクティブ化したときに、バーチャルカメラの位置を即時更新する処理は見当たりませんでした
- Dampingといった遅延設定類が、Live/Standby状態に代わった際にも反映されて、Disable時の位置からの移動途中が見えてしまうような意図しない切り替わり挙動となる場合があります
- アクティブ化したときに、バーチャルカメラの位置を即時更新する処理は見当たりませんでした
Priority変更によるカメラ切り替え
- バーチャルカメラ設定のPriorityを直接変更することでもカメラ切り替えが可能です
- Priorityが低いアクティブなバーチャルカメラはStanby状態で、追従挙動も動作しています
- 複数の追従カメラを切り替えるといった場合は、Priorityで切り替えたほうが良いです
- Body に FramingTransposer を指定していた場合
- 回転だけでなく移動にも遊び(DeadZone)を持たせることができますが、カメラ切り替え後に Follow 対象が注視点にならなくなってしまいます
- Damping が遅くて追従しきれていない
- DeadZone が広くて DeadZone の端にFollow対象がいる
- これらの2点は、一時的にSoftZoneを0に設定することでFollow対象を注視点にしておくことができます
- Stanby時はSoftZoneを0にしておき、Live化時にSoftZoneを設定し直すなどの対策が必要な場合があります
- 回転だけでなく移動にも遊び(DeadZone)を持たせることができますが、カメラ切り替え後に Follow 対象が注視点にならなくなってしまいます
カメラ切り替え設定
カメラ切り替え時の補正の時間・起動を設定できます。
切り替えの時間
- CinemachineBrain で設定
- DefaultBlend で、種類(Cut = 補間なし, EaseInOut, Linear など)と時間を設定
- CustomBlends用アセットを作成すると、どのバーチャルカメラからどのバーチャルカメラに切り替えた場合にどの補間を使用するかを設定可能
- CustomBlends用設定はアセットファイル指定で、さらにカメラの判別方法がオブジェクト名指定のためバーチャルカメラ数を固定化しない作りにしたい場合などには適さないと思われます
切り替えの軌道
- バーチャルカメラの Transitions で設定
- Blend Hint で、球状・円柱状の軌道を設定
- None : 線形補間
- Spherical Position : 球状
- Cylindrical Position : 円柱状
- Blend Hint で、球状・円柱状の軌道を設定
振動
バーチャルカメラ自体に振動を設定する方法と、衝撃を発生させることで対象のバーチャルカメラに振動を反映させる方法があります。
常時振動させる (Noise)
バーチャルカメラ の Noise を設定することで振動させられます。
- Noise
- デフォルトは none になっていますが、Basic Multi Channel Perlin を選択すると以降の項目が編集できるようになります。
- Noise Profile
- どんな動きで振動するかのパターン、振動曲線を設定したアセットを選択。
- プリセットの 6D Shake など。
- Noise_CM_4 や Handheld_normal_extreme などの Handheld系は手ブレっぽい振動です。
- Amplitude Gain
- 振動の大きさ。
- Frequency Gain
- 振動の細かさ。
衝撃を発生して振動させる (CinemachineImpulseSource, CinemachineImpulseListener)
- バーチャルカメラ の Add Extensions から CinemachineImpulseListener を選択してコンポーネント追加します
- コライダーから衝撃を発行する場合
- Rigidbody付きオブジェクトに、CinemachineCollisionImpulseSource コンポーネントを追加してパラメータ設定
- これにより、コライダーが衝突すると衝撃が発行されて、Listener を設定したバーチャルカメラが振動します
- Rigidbodyの無いコライダ付きオブジェクトにCinemachineCollisionImpulseSourceを追加した場合は、別のRigidbody付きオブジェクトに衝突した際に振動します
- コードから衝撃を発行する場合
- オブジェクトに CinemachineImpulseSource コンポーネントを追加してパラメータ設定
- CinemachineImpulseSource.GenerateImpulse(), GenerateImpulseAt() を呼び出すと、衝撃が発行されて、Listener を設定したバーチャルカメラが振動します
- 振動中に同一コンポーネントから再度衝撃を発行すると、振動の挙動が上書きされます
- 単一の CinemachineImpulseSource を使いまわしてパラメータ変更で振動を変えることもできますが、振動を上書きせずにそれぞれの衝撃で振動させたい場合は CinemachineImpulseSource を使い回さず複数用意してそれぞれから衝撃を発行させます
- AnimationClip の AnimationEvent から衝撃を発行する場合
- CinemachineImpulseSource.GenerateImpulse() は AnimationEvent に設定できますが、オーバーロードされているため呼び出しに失敗します
- ラッパーを作ることで、AnimationEvent からも振動させられます
ImpulseSourceのパラメータ
- Impulse Channel
- 衝撃を受け取るバーチャルカメラ側と同じチャンネルを設定。
- Signal Shape
- どんな動きで振動するかのパターン、振動曲線を設定したアセットを選択。
- プリセットの 6D Shake などから選択。Handheld系は手ブレっぽい振動です。
- プリセットが直接選択できない場合、 Packages/Cinemachine/Presets/Noise に入っています。
- New から自作もできて、縦揺れ・横揺れなども設定できます。
- Amplitude Gain
- 振動の大きさ。
- Frequency Gain
- 振動の細かさ。
- Time Envelope
- 振動の時間設定。
- Attack : 振動の立ち上がり時間
- Sustain Time : 立ち上がり後の最大振動の継続時間
- Decay : Attack + SustainTime 後に減衰しつつ振動を終了させる時間
- Attack + SustainTime + Dcay = 振動の合計時間
- 振動の時間設定。
- Spatial Range
- 衝撃発生源とカメラとの距離による減衰設定。
ズーム
FOVでのズーム (CinemachineFollowZoom)
- バーチャルカメラの Add Extensions から CinemachineFollowZoom を選択してコンポーネント追加します
- Width でズームの基準値を設定して、Min FOV / Max FOV を設定して、ズームさせることができます
- FOVでのズームです
- 移動範囲制限を設定していてカメラがキャラクター類を追従する制限がある場合や、カメラがそもそもキャラクターの移動に合わせて移動しない場合などで、LookAt 対象が遠くなっても画面上の表示の大きさを保ちたいときなどに使用できます
- カメラが常にキャラクターを追従していて、一時的にズームしたい場合には Width を変更するなどでズームさせることもできます
移動範囲制限
バーチャルカメラの移動範囲を制限することができます。
特定のコライダ範囲内のみを移動するカメラ (CinemachineConfiner)
- バーチャルカメラの Add Extensions から Cinemachine Confiner を選択してコンポーネント追加します
- カメラの移動範囲にするコライダを用意します
- Cinemachine Confiner の Bounding Volume に対象のコライダを設定
- Confine Mode はコライダが2Dか3Dかによって合わせます
- これにより、バーチャルカメラがキャラクター類に追従する設定にしていても、カメラの移動範囲が用意したコライダ内に制限されます
ドリーパスの使用 (CinemachineSmoothPath, CinemachineDollyCart)
パスを作り、その軌道上のみを移動するカメラを設定できます。
移動範囲がドリーパス上のみのカメラ
- Unityメニュー → Cinemachine → Create Dolly Camera With Track で、Body が Tracked Dolly のバーチャルカメラと、パスを設定する CinemachineSmoothPath のオブジェクトが生成されます
- Follow に指定したオブジェクトに近いパス上にカメラが移動するタイプです
ドリーパス上を指定速度・位置指定で移動するカメラ
- Unityメニュー → Cinemachine → Create Dolly Track With Cart で、パスを設定する CinemachineSmoothPath のオブジェクトと、パス上を移動する CinemachineDollyCart オブジェクトが生成されます
- バーチャルカメラは生成されません
- 移動させたいバーチャルカメラの Follow を CinemachineDollyCart オブジェクトにして、Body を Hard Lock To Target に設定すると、バーチャルカメラの位置をカートの位置にすることができます
- この状態でカートを移動させると、バーチャルカメラがカートの位置なのでカメラがパス上を移動する形になります
- カート位置は CinemachineDollyCart の Position で設定し、Speed を設定すればパス上をカートが自動で移動します
遮蔽物回避
バーチャルカメラと追従対象の間に遮蔽物が存在すると追従対象がカメラに映らなくなってしまいますが、バーチャルカメラ自身を移動させたり別のバーチャルカメラに切り替えたりして追従対象がカメラに映るように遮蔽物を回避させることができます。
バーチャルカメラの移動による遮蔽物の回避 (CinemachineCollider)
- バーチャルカメラの Add Extensions から CinemachineCollider を選択してコンポーネント追加します
- カメラと追従対象との間に遮蔽物(Collider)がくると、追従対象が見えるようにカメラが遮蔽物を避けて移動するようになります
- Damping Whrn Occluded が遮蔽されたときの回避移動の遅延で、Damping が遮蔽物回避状態から戻すときの遅延で、小さいほど素早くカメラが移動します
- Minimum Occlusion Time は遮蔽されてから回避移動を開始するまでの時間で、Smoothing Time は遮蔽物が無くなってからカメラをもとに戻しはじめるまでの時間です
- Strategy で回避方法を選択できます(画像では3種類の回避方法を順番に切り替えています)
- また、Avoid Obstacles を無効にすると、自動で回避しなくなりますが、CinemachineCollider.IsTargetObscured() で遮蔽物があるか判別できます
バーチャルカメラの切り替えによる遮蔽物の回避 (CinemachineClearShot)
- Unityメニュー → Cinemachine → Create ClearShot Camera で、CinemachineClearShot オブジェクトと、その子に CinemachineCollider の付いたバーチャルカメラが生成されます
- 子の複数のバーチャルカメラの CinemachineCollider 設定が全て同じ場合は、CinemachineCollider を個々のバーチャルカメラに付けるのではなく、CinemachineClearShot に1つだけ付ける形に変えても問題ありません
- 子のバーチャルカメラを複数用意して、それぞれ異なる追従設定をして、メインとするカメラの Priority を上げておきます
- メインとなるカメラが遮蔽物(Collider)によって対象を遮られた場合に、遮蔽物のない他の子カメラに切り替わるようになります
- 子のカメラの切り替え時間などの設定は、CinemachineBrain ではなく、CinemachineClearShot で設定します
(画像ではバーチャルカメラを3つ用意していて、メインのバーチャルカメラと、回避用に左側と上方とに配置しています。メインが壁で遮られたら左側カメラ、メインも左側カメラも遮られたら上方カメラに切り替わっています。)
機能拡張
移動・回転挙動の自作
- 移動・回転などの挙動を自作する場合、バーチャルカメラの Body / Aim を Do nothing にして別途スクリプトからバーチャルカメラを動かすといった方法が取れます
- また、CinemachineComponentBase クラスを派生させて、Body / Aim の挙動を自作することができます
- Stage プロパティに Body か Aim かを指定することで、どちらの機能なのかを指定します
挙動の追加
- CinemachineCollider, CinemachineConfiner, CinemachineFollowZoom のように、バーチャルカメラの Add Extensions から挙動を追加するタイプは、CinemachineExtension クラスを派生させて自作することができます
まとめ
より詳しい内容や、ここでの記載内容以外の機能などもあるので、公式のドキュメントやサンプルにもぜひ触れてみてください。
一通りの機能が入っているため、ガッツリとカメラを制御したい場合にも、手軽にカメラ機能を導入してみたい場合にも使いやすいかと思います。