【Unity】【Cinemachine】Camera OffsetでCinemachineで計算したカメラ位置を上書きする

CinemachineでCamera OffsetでCinemachineで計算したカメラ位置を上書きする方法です。

Unity2018.4.0
Cinemachine2.2.9

Cinemachine Camera Offset?

Cinemachine Camera OffsetはVirtual Cameraで使えるExtensionsの一種です。

f:id:halya_11:20190707142011p:plain

Virtual CameraはBodyの設定に基づいてカメラの位置を調整します。
またAimの設定によってカメラの回転を調整します。
AimをGroup Composerにした場合などにはAimによって位置も調整されます。
さらにそのあと、Noiseが設定されている場合にはこれにより位置が調整されます。

f:id:halya_11:20190707142541p:plain

このようにCinemachineではVirtual Cameraによりカメラの位置が制御されるため、
独自で位置を変えたい場合にはこれらとの整合性を取る必要があります。

これを行うコンポーネントがCinemachine Camera Offsetです。

使い方

Cinemachine Camera Offsetを使うには、Virtual CameraのExtensionsからCinemachineCameraOffsetを選択してアタッチします。

f:id:halya_11:20190707142011p:plain

アタッチしたらまず、Apply Afterにどのタイミングで位置にオフセットを掛けるかを指定します。

f:id:halya_11:20190707142823p:plain

それぞれの意味は下記の通りです。

名前 説明
Body Bodyを処理した後
Aim Aimを処理した後
Nose Noiseを処理した後
Finalize 一番最後

タイミングを決めたら後はOffsetを入力するだけです。

f:id:halya_11:20190707142743p:plain

この分だけ位置が補正されます。

スクリプトで制御する

Cinemachine Camera Offsetはスクリプトから編集することもできます。

using UnityEngine;

public class Example : MonoBehaviour
{
    [SerializeField]
    private CinemachineCameraOffset _cinemachineOffset;
    [SerializeField]
    private float _radius;
    [SerializeField]
    private float _speed;

    void Update()
    {
        var time = Time.time * _speed;
        var x = _radius * Mathf.Cos(time);
        var y = _radius * Mathf.Sin(time);

        _cinemachineOffset.m_Offset = transform.localToWorldMatrix * new Vector3(0, x, y);
    }
}

再生するとOffsetがかかっていることが確認できます。

f:id:halya_11:20190707143604g:plain