この記事でのバージョン
Unity 2022.3.21f1
Cinemachine 2.9.7
はじめに
カメラ操作を簡単に行えるUnityの公式機能Cinemachineを使ってる際に、
カメラの位置を取得して、その近辺にオブジェクトを置こうと思ったら
カメラが移動中だったため座標がずれた事がありました。
という事で今回はCinemachine(というかCinemachineVirtualCamera)の移動や補正中の現在値でなく、
目標の位置(移動や補正が完了した後の位置)を取得する方法の紹介です!
CinemachineVirtualCameraの目標の位置を取得する方法
まず、そもそもオブジェクトを追跡しているかは、
Followにオブジェクトが設定されているかで判断します。
//追跡中の対象を取得 Transform followTarget = virtualCamera.Follow; if (followTarget == null) { /*追跡中の対象はなし*/ }
次に追跡時のオフセットはInspector上だとFollow Offsetで設定しますが、
プログラムではCinemachineTransposerを取得してm_FollowOffsetから確認できます。
//オフセット取得 CinemachineTransposer transposer = virtualCamera.GetCinemachineComponent<CinemachineTransposer>(); if (transposer != null) { var offset = transposer.m_FollowOffset; }
この2つを用いて、拡張メソッド を使ってみると以下のような感じに。
なお、Transposer以外には対応していないのであしからず。
using UnityEngine; using Cinemachine; /// <summary> /// CinemachineVirtualCameraの拡張クラス /// </summary> public static class CinemachineVirtualCameraExtension { /// <summary> /// 対象の位置(補正で移動中でも移動先の位置を取得) /// </summary> public static Vector3 GetTargetPosition(this CinemachineVirtualCamera virtualCamera) { //追跡中のオブジェクトを取得、なければそのまま座標を返す Transform followTarget = virtualCamera.Follow; if (followTarget == null) { return virtualCamera.transform.position; } //Transposer の設定コンポーネント取得、なければ追跡対象の座標を返す CinemachineTransposer transposer = virtualCamera.GetCinemachineComponent<CinemachineTransposer>(); if (transposer == null) { return followTarget.position; } //追跡対象の座標からオフセットを追加したものを返す return followTarget.position + transposer.m_FollowOffset; } }
上記のスクリプトを作成すると、
どのCinemachineVirtualCameraからでも簡単に目標の位置を取得できるようになります。
//CinemachineVirtualCameraから目標の位置を取得 var targetPosition = virtualCamera.GetTargetPosition();