(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

CinemachineVirtualCameraの移動や補正中の現在値でなく、目標の位置を取得する方法【Unity】【Cinemachine】


このエントリーをはてなブックマークに追加

この記事でのバージョン
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();