CinemachineCameraを使ったカメラ制御とズーム機能(InputSystem版:キー操作)

概要

この資料では、Unity の新しい Input System と最新版の Cinemachine(名前空間が Unity.Cinemachine)を活用し、カメラの Field of View (FOV) をポーリングによってズームイン/ズームアウトする実装方法について解説します。
具体的には、’Z’ キーでズームイン、’X’ キーでズームアウトする動作を実現します。

必要な環境

  • Unity: 2019.1 以降(Input System パッケージがインストール済み)
  • Cinemachine: 最新版(名前空間は Unity.Cinemachine を使用)

実装の流れ

  1. 名前空間の設定
    • UnityEngine.InputSystem:新しい Input System を利用するために追加します。
    • Unity.Cinemachine:最新版の Cinemachine のクラスを使用するために追加します。
  2. カメラ型の選択
    最新の Cinemachine では、CinemachineCamera 型を使用することでエラーなくコンパイルできます。
  3. ポーリングによる入力検出
    Update() メソッド内で、Keyboard.current を使用してキー入力をポーリングします。
    'Z’ キーが押されている場合はズームイン、’X’ キーが押されている場合はズームアウトの処理を行います。
  4. Mathf.Lerp による滑らかな FOV 変化
    Mathf.Lerp を利用し、現在の FOV から目標の FOV への遷移をスムーズに実現します。
    なお、Time.deltaTime を掛けることでフレームレート依存性を排除しています。

コード例

using UnityEngine;
using UnityEngine.InputSystem;
using Unity.Cinemachine;

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

    void Update()
    {
        if (virtualCamera == null || Keyboard.current == null)
            return;

        // 'Z' キーが押されている場合はズームイン
        if (Keyboard.current.zKey.isPressed)
        {
            virtualCamera.Lens.FieldOfView = Mathf.Lerp(
                virtualCamera.Lens.FieldOfView,
                zoomInFOV,
                Time.deltaTime * zoomSpeed
            );
        }
        // 'X' キーが押されている場合はズームアウト
        else if (Keyboard.current.xKey.isPressed)
        {
            virtualCamera.Lens.FieldOfView = Mathf.Lerp(
                virtualCamera.Lens.FieldOfView,
                zoomOutFOV,
                Time.deltaTime * zoomSpeed
            );
        }
    }
}
  • 名前空間の変更
    最新の Cinemachine パッケージでは、従来の using Cinemachine; の代わりに using Unity.Cinemachine; を利用する必要があります。
    これにより、CinemachineCamera クラスなどが正しく参照され、コンパイルエラーが解消されます。
  • Input System の利用
    UnityEngine.InputSystem を導入することで、Keyboard.current を使い、毎フレームキー入力をポーリングして状態を取得できます。
    この方法により、リアルタイムでのキー入力に応じた処理が可能になります。
  • 滑らかな FOV 遷移
    Mathf.Lerp を用いて、現在の FOV 値から目標の FOV 値(ズームイン時は zoomInFOV、ズームアウト時は zoomOutFOV)への補間を行います。
    Time.deltaTime * zoomSpeed により、フレームレートに依存しない滑らかなズーム効果が実現されます。
  • エラーチェック
    virtualCameraKeyboard.current が null の場合は処理を中断することで、実行時のエラーを未然に防ぎます。

注意点

  • プロジェクトにおいて、Input System を利用する際はプロジェクト設定で新しい Input System を有効にしてください。
  • Cinemachine のバージョンによっては、使用する型(例: CinemachineVirtualCamera など)が異なる場合があります。
    本コード例では、エラーなく動作する CinemachineCamera を使用しています。

この資料を参考に、Unity プロジェクトに組み込むことで、最新の名前空間設定と型に対応したカメラのズーム制御が実現できます。

Unity

Posted by hidepon