0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】Cinemachineカメラ制御とある不具合についての記録

Last updated at Posted at 2024-07-24

実装したい内容:
三人称カメラ(CinemachineVirtualCamera)から一人称カメラ(CinemachineFreeLook)のカメラワークを発生させて、スクリプトでCinemachineFreeLookのAim属性を「Do nothing」で設定すること。
*一人称カメラを別途で制御したいため、一旦Cinemachine制御から外すことは目的です。

例:
三人称カメラ(CinemachineVirtualCamera)からとあるキューブを注目している一人称カメラ(CinemachineFreeLook)の遷移ワーク。

すると、望まない動作が発生しました。
画面はこうなりました:
スクリーンショット 2024-07-24 17.56.29.png
↑カメラの動きが何故か完成していない、「Look At」に設定されたキューブは画面の中心になっていません。

解決策:
一旦カメラワークを待つ、動きが終わったら、「Aim」を設定します。

スクリーンショット 2024-07-24 18.03.37.png
↑カメラの動きは期待通りになりました。

関連ソースコードは以下になります。
*ここは便宜のため、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;
        }
    }
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?