【Unity】Cinemachineカメラが障害物にめり込まないようにする

カメラが壁とかキャラクターにめり込まないようにするにはどうすればいいの~?

Cinemachine Colliderを使えば良いわ!

Cinemachineで制御するカメラが障害物にめり込まないようにしたい場合があります。

このような場合、Cinemachine Colliderという機能拡張(Extension)を使えば実現できます。

障害物の回避は、シーン上に配置されているコライダーに基づいて行われます。

参考:Cinemachine Collider | Cinemachine | 2.8.0

コライダーの回避方法にはいくつか種類があり、状況に合わせて使い分けることができます。

本記事では、Cinemachine Colliderを用いてバーチャルカメラがコライダーにめり込まないようにする方法を解説します。

この作品はユニティちゃんライセンス条項の元に提供されています

動作環境
  • Unity2021.1.22f1
  • Cinemachine2.7.8

前提条件

事前にCinemachineパッケージがインストールされ、バーチャルカメラが設定されているものとします。

設定方法がわからない方は、以下記事をご覧ください。

【Unity】滑らかに(遅れて)追従するカメラを簡単に実装する方法
Cinemachineを用いてキャラクターを追従するカメラワークを実装する方法の解説記事です。 キャラクターを追従するカメラワークはスクリプトでも実装できますが、Cinemachineを使うことで次のメリットが得られます ...

障害物コライダーの配置

建物やキャラクター等、めり込み回避したいオブジェクトにコライダーが適用されている場合は、本手順は不要です。設定されていない場合は、あらかじめ設定しておいてください。

本記事では、次のような建物にコライダーを適用するものとします。

Cinemachine Colliderの追加

バーチャルカメラとコライダーの配置が済んだら、バーチャルカメラ側にCinemachine Colliderを適用していきます。

バーチャルカメラコンポーネントのExtensions > Add ExtensionよりCinemachineColliderを選択します。

すると、Cinemachine Colliderコンポーネントが追加されます。これが障害物回避するためのExtensionです。

設定項目が沢山ありますが、順を追って説明していきます。ここで障害物回避のための細かい設定ができます。

Cinemachine Colliderの各項目の設定

各項目について、必要なら動画を示しながら説明していきます。

設定項目の詳細については、以下公式リファレンスもあわせてご覧ください。

参考:Cinemachine Collider | Cinemachine | 2.8.0

障害物とみなすレイヤー

Collide Againstには、カメラが障害物とみなすレイヤーを指定します。レイヤーは複数設定できます。

このレイヤーが設定されているコライダー内にはカメラが侵入しないように制御されます。

障害物とみなさないタグ

Ignore Tagには、障害物判定を無視するタグを設定できます。例えば、プレイヤーなど追従対象のタグを設定します。

透明な障害物レイヤー

Transparent Layersには、ガラスなどの透明な障害物のレイヤーを設定します。

このレイヤーを設定することで、障害物越しにターゲットを見るようなカメラワークを実現できます。

動画の例では、半透明オブジェクトのレイヤーがTransparent Layersに設定されています。半透明オブジェクトでは障害物越しにプレイヤーを注視していることがわかります。

ターゲットに近づける最小距離

Minimum Distance From Targetには、カメラがこれ以上近づけない最小距離を設定します。プレイヤーにカメラが近づきすぎないようにしたい場合に役立ちます。

ここでいう距離とは、ターゲットの中心とカメラの距離を指します。ターゲットのコライダー表面とカメラとの距離ではありません。

障害物回避の有効・無効設定

Avoid Obstaclesを有効にすると、カメラの障害物回避が有効になります。デフォルトでは有効になっています。

無効にすると、カメラが障害物回避を行わなくなりますが、対象物が画面に映っているかどうかなどの品質評価は行われます。

障害物判定のレイキャスト距離

Distance Limitには、カメラからターゲットへの視線が遮蔽されていないか確認するために使うレイキャストの距離を指定します。

例えば1を指定すると、距離が1より遠くにある遮蔽物は無視されます。プレイヤー付近にある障害物は無視したい場合などに活用できます。

0を指定すると、距離制限なしにカメラからターゲットの間に存在するすべての遮蔽物が判定対象になります。

障害物回避が始まるまでの時間

Minimum Occlusion Timeには、ターゲットが遮蔽物に隠れてから実際に障害物回避が始まるまでの時間を指定します。

例えば1が設定されていると、遮蔽物に隠れてから1秒間は障害物回避しなくなります。

カメラ半径

Camera Radiusには、カメラ自体の衝突判定の半径を指定します。この半径内に障害物が入らないように障害物回避が行われます。

障害物の回避方法

Strategyには、視線を確保するための障害物回避の方法を指定します。次の3種類の方法が指定できます。

Pull Camera Forward

カメラがターゲット前方に向けて引っ張られるように回避する方法です。カメラの向きに沿って前後するような回避をします。

Preserve Camera Height

カメラの元々の高さをできるだけ維持しつつ障害物を回避します。

Preserve Camera Distance

ターゲットからの元々の距離をできるだけ維持しつつ障害物回避します。

障害物がヒットする上限

Maximum Effortには、障害物のレイキャスト判定の上限を指定します。最大でこの回数だけコライダーのレイキャスト処理が走ります。値が大きいほど精度の良い障害物判定ができますが、その分処理負荷が高くなります。

接近状態を維持する最低限の秒数

Smoothing Timeには、障害物回避でターゲットに近づいたときの状態を維持する秒数を指定します。

例えば2を指定すると、遮蔽物がなくなっても2秒間ターゲットに接近した状態を維持し続けます。遮蔽物の有無によってカメラが激しく動くのを防ぐのに役立ちます。

ターゲットから離れるときの素早さ

Dampingには、遮蔽物が無くなってからターゲットに戻るときの素早さを指定します。

0だと瞬時に戻り、値が大きくなるほど緩やかに戻ります。

ターゲットに近づくときの素早さ

Damping When Occludedには、ターゲットが遮蔽物に隠れてから障害物回避するときの素早さを指定します。

Damping同様、0だと瞬時に回避し、値が大きくなるほど緩やかに回避するようになります。

距離による品質評価

Optimal Target Distanceに0より大きい値を指定すると、ターゲットとの距離がこの値に近づくほど高いショットのスコアを与えます。0の時はこの機能は無効になります。

パラメータの設定例

ここまで一通りパラメータの内容を解説しましたが、最終的な設定例を紹介します。

実行結果

さいごに

Cinemachine Colliderの機能拡張を用いて、カメラを障害物回避させる方法について解説しました。

設定項目が多いため迷いやすいところですが、必要になったときに意味を調べて調整する流れで問題ないでしょう。
状況にもよりますが、障害物レイヤーと回避方法、素早さの設定を行えばそれなりのカメラワークができるようになることでしょう。

Cinemachineには、ほかにもいくつかの拡張機能が用意されています。例えば、BoxやSphere、Capsuleなどのコライダー内にカメラを閉じ込めるCinemachine Confinerがあります。

【Unity】Cinemachineカメラの移動範囲をコライダー内に制限する
Cinemachineには、バーチャルカメラの移動範囲を特定のコライダー内に制限するCinemachineConfinerという機能拡張(Extension)が存在します。 CinemachineConfinerを用いる ...

状況に応じて使い分けると良いでしょう。

参考サイト