Unity Cinemachine Virtualカメラのズームをマウスホイールでコントロールする

今回は、Unity CinemachineのVirtual Cameraでズームをマウスホイールでコントロールする方法について記載します。
本来、CinemachineはTimelineを活用するなどして、Scriptを組まずとも映画のようなカメラワークが可能、というのが売りのようなのですが、
Timelineが使いこなせていない私はScriptを活用して色々作ってしまいました。恐らく無駄なことを多くしていると思います。

さて、前回、以下の記事でCinemachineのカメラのAimにPOVを設定して、回転をマウス右クリック時に行うようにするところまで記載しました。

Unity Cinemachine  POVカメラで右マウスボタン押下時のみカメラを回転させる – Craneのブログ (crane-art.com)

今回はそれに加え、マウスホイールでズームイン・アウトをできるようにします。
Scriptを作成してみました。
なお、滑らかにズームイン・アウトを行わせるためにDOTweenを使っています。

スクリプト

おおまかな前提としては

・Cinemachineを使用していること。
・DOTweenがインストールされていること

DOTweenは無料のアセットです。以下からダウンロードできます。

DOTween (HOTween v2) | アニメーション ツール | Unity Asset Store

以下のスクリプトを作成しました。(プログラミング初心者のため、変なところが沢山あると思います・・・)

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Cinemachine; //Cinemachineを使うため記述
  5. using DG.Tweening; //DOTweenを使うため記述
  6.  
  7. public class CMvCamController : MonoBehaviour
  8. {
  9.     float scroll;
  10.     float view;
  11.     float targetFOV;
  12.  
  13.     [SerializeField] CinemachineVirtualCamera vcamera;
  14.     [SerializeField] CinemachineBrain cmBrain;
  15.     [SerializeField] ICinemachineCamera icCam;
  16.  
  17.     [SerializeField] float minFOV; 
  18.     [SerializeField] float maxFOV;
  19.     [SerializeField] float scrollVolume;
  20.  
  21.     // Update is called once per frame
  22.     void Update()
  23.     {
  24.         MouseEvent();
  25.     }
  26.  
  27.     private void MouseEvent()
  28.     {
  29.         icCam = cmBrain.ActiveVirtualCamera;
  30.         GameObject vCamObj = icCam.VirtualCameraGameObject;
  31.         if (vCamObj != this.gameObject) // 自分のカメラがアクティブのときのみ作動
  32.         {
  33.             return;
  34.         }
  35.         else
  36.         if((Input.GetMouseButtonDown(2))) //右ボタン押下時にはズーム動作しないようにする 
  37.         {
  38.             return; 
  39.         }
  40.         else
  41.         {
  42.         scroll = Input.GetAxis(“Mouse ScrollWheel”);
  43.             if (scroll != 0.0f)
  44.             {
  45.                 view = vcamera.m_Lens.FieldOfView – scroll * scrollVolume;
  46.                 targetFOV = Mathf.Clamp(value: view, min: minFOV, max: maxFOV);
  47.                 SetFOV(targetFOV);
  48.             }
  49.         }
  50.     }
  51.  
  52.     public void SetFOV(float fov)
  53.     {
  54.         DOTween.To(
  55.           () => vcamera.m_Lens.FieldOfView,
  56.           num => vcamera.m_Lens.FieldOfView = num,
  57.           fov,
  58.           1.0f
  59.           ); //DOTweenを使って、VirtualCameraのFOVが1秒間でfovの値に変化するようにしている。
  60.     }
  61. }

設定等

設定としては、上記のスクリプトを対象のVirtualCameraにアタッチして、Vcameraの欄にはコントロールしたいVirtualCamera(つまりスクリプトをアタッチするカメラと同じ)を、Cm BrainにはCinemachineBrainを設定している物理カメラを設定。
MinFOV,MaxFOVはレンズのズーム範囲、Scroll Volumeはズーム速度になります。

ちなみに、単純にFOVに値を入れるだけであれば、以下でできます

vcamera.m_Lens.FieldOfView = xx;(値、float)
※vcameraはCinemachineVirtualCameraクラスを継承。(13行目)

留意事項等

Cinemachineには「CinemachineFollowZoom」という、Look Atに設定した対象に合わせてズームを行う機能があり、VirtualCameraのAdd Extensionから追加・設定できます。
今回は、特にLook At対象を設定せずPOVカメラ的に動作させるケースを想定してScriptを作りました。

今回は以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です