実装したい内容:
三人称カメラ(CinemachineVirtualCamera)から一人称カメラ(CinemachineFreeLook)のカメラワークを発生させて、スクリプトでCinemachineFreeLookのAim属性を「Do nothing」で設定すること。
*一人称カメラを別途で制御したいため、一旦Cinemachine制御から外すことは目的です。
例:
三人称カメラ(CinemachineVirtualCamera)からとあるキューブを注目している一人称カメラ(CinemachineFreeLook)の遷移ワーク。
すると、望まない動作が発生しました。
画面はこうなりました:
↑カメラの動きが何故か完成していない、「Look At」に設定されたキューブは画面の中心になっていません。
解決策:
一旦カメラワークを待つ、動きが終わったら、「Aim」を設定します。
関連ソースコードは以下になります。
*ここは便宜のため、UniTaskを使わせていただきます。m(_ _)m
CameraTest.cs
using Cinemachine;
using UnityEngine;
using Cysharp.Threading.Tasks;
using System;
public class CameraTest : MonoBehaviour
{
//カメラワークの時間を取得のためだけ
public CinemachineBrain cinemachineBrain;
//三人称カメラ
public CinemachineVirtualCameraBase mainCamera;
//キューブ注目カメラ
public CinemachineFreeLook freelookCamera;
//LookAtのキューブ
public Transform testLookAt;
public void ChangeCam()
{
changeCamAsync().Forget();
}
public async UniTask changeCamAsync()
{
bool isChangeToFree = mainCamera.gameObject.activeSelf;
mainCamera.gameObject.SetActive(!isChangeToFree);
freelookCamera.gameObject.SetActive(isChangeToFree);
if (isChangeToFree)
{
//一人称カメラのパラメータ設置
freelookCamera.m_BindingMode = CinemachineTransposer.BindingMode.LockToTargetWithWorldUp;
freelookCamera.Follow = testLookAt;
freelookCamera.LookAt = testLookAt;
//肝心なカメラワーク待つロジック
await UniTask.Delay(TimeSpan.FromSeconds(cinemachineBrain.m_DefaultBlend.m_Time));
//下記の三行コードの挙動とは、属性「Aim」を「Do nothing」で設定するとは同じです。
//「Do nothing」設置開始
var nowRig = freelookCamera.GetRig(1);
var cinemachineComponent = nowRig.AddCinemachineComponent<CinemachineComposer>();
cinemachineComponent.enabled = false;
//「Do nothing」設置完了
}
else
{
//属性「Aim」を「Do nothing」から「Composer」戻ります
var nowRig = freelookCamera.GetRig(1);
var cinemachineComponent = nowRig.AddCinemachineComponent<CinemachineComposer>();
cinemachineComponent.enabled = true;
}
}
}