【Unity】Cinemachineでターゲットを拡大表示したい

Cinemachineを使うとMainCameraのPositionはユーザでは制御できなくなります
どのようにイメージ通りにできるのかみていきましょう

CinemachineVirtualCamera

CinemachineVirtualCameraは、Unityのゲーム開発プラットフォーム内で使用されるCinemachineライブラリの一部です。これは、ゲーム開発者がカメラの動きや挙動を容易にかつ精密に制御することができるパワフルなツールセットを提供します。

CinemachineVirtualCameraは、シーン内の特定のオブジェクトに対して自動的にフォーカスを当てたり、スムーズなカメラモーションを生成したり、シネマティックなカットシーンを作成したりするのに使われます。プログラミングやアニメーションなしでカメラの動きを制御できるため、開発の速度と品質の向上に寄与します。

以下はCinemachineVirtualCameraの主な特徴です:

  • Follow(フォロー): カメラが追従するオブジェクトを指定します。例えば、プレイヤーのキャラクターを常に中心に保ちながら移動することができます。
  • Look At(注視): カメラが注目するオブジェクトを指定します。カメラはこのオブジェクトを中心にして位置を調整します。
  • Lens Settings(レンズ設定): カメラのFOV(Field of View)やクリップ平面(画面に映る範囲の近い限界と遠い限界)など、レンズの物理的な特性を模倣します。
  • Priority(優先度): 複数のカメラがある場合に、どのカメラがアクティブなビューを提供するかを決定します。数値が高いカメラが優先されます。

CinemachineVirtualCameraは、コードを書かずにインタラクティブなカメラワークを設定することを可能にし、特に映画的なカメラモーションが求められるゲーム開発において非常に重宝されます。ノンプログラマーでもインスペクタを通じて視覚的にパラメータを調整することができ、独自のカメラシステムを作成することができるため、チーム内での多様なスキルセットを持ったメンバーが協力して作業する場合にも有用です。

FOV(Field of View)

Vertical FOVは「Field of View(視野)」の略です。この数値を変更すると、カメラがキャプチャする縦の視野の角度が変わります。表示されている68.20437は、縦の視野角が約68度であることを意味しています。

カメラの設定で「Follow」と「Look At」の設定があり、これらはカメラが追跡する対象や注視する対象を指定するものです。「Priority」の値はカメラの優先度を設定するもので、複数のカメラがある場合にどのカメラがアクティブになるかを決めます。

ターゲットにズームイン

ターゲットにズームインするためには、CinemachineVirtualCameraのレンズ設定を調整する必要があります。特に、「Field of View(視野)」または「FOV」と呼ばれる設定を小さくすることで、ズームイン効果を得ることができます。FOVの値を減らすと、カメラの視野が狭くなり、オブジェクトが大きく、より詳細に見えるようになります。

UnityのCinemachineでは、次のようなステップでズームを行います:

  1. Cinemachine Virtual Cameraを選択: Unityのエディター内で、ズームしたいCinemachine Virtual Cameraを選択します。
  2. Lensセクションを探す: インスペクター内のLensセクションを見つけます。
  3. Field of Viewを調整: 「Field of View」または「FOV」のスライダーを見つけ、値を小さくしてズームインします。逆に、値を大きくすればズームアウトします。

また、CinemachineVirtualCameraは「Damping」や「Framing」などのパラメータも提供しており、これらを利用してターゲットへのスムーズなズームインやズームアウトの動きを作成することもできます。これにより、ゲーム内でプレイヤーが注目するべきポイントに対して、自然なカメラワークを提供できるようになります。

コードでズームイン、ズームアウト

プログラミングによるアプローチが必要な場合、Unityのスクリプトを使用して、ゲームの実行中に動的にカメラのFOVを変更することも可能です。この方法は、プレイヤーのアクションやゲームのイベントに応じてズームを制御したい場合に便利です。

using UnityEngine;
using Cinemachine;

public class CameraZoom : MonoBehaviour
{
    public CinemachineVirtualCamera virtualCamera;
    public float zoomInFOV = 30f;    // ズームイン時のFOV値
    public float zoomOutFOV = 60f;   // ズームアウト時のFOV値
    public float zoomSpeed = 10f;    // ズームの速さ

    void Update()
    {
        if (virtualCamera != null)
        {
            // 'Z'キーを押すとズームイン
            if (Input.GetKey(KeyCode.Z))
            {
                virtualCamera.m_Lens.FieldOfView = Mathf.Lerp(virtualCamera.m_Lens.FieldOfView, zoomInFOV, Time.deltaTime * zoomSpeed);
            }
            // 'X'キーを押すとズームアウト
            else if (Input.GetKey(KeyCode.X))
            {
                virtualCamera.m_Lens.FieldOfView = Mathf.Lerp(virtualCamera.m_Lens.FieldOfView, zoomOutFOV, Time.deltaTime * zoomSpeed);
            }
        }
    }
}

Unity

Posted by hidepon