いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : カメラをベジェ曲線にそって動かす

カメラをキャラのまわりにそってグイグイ動かしたかったのですが、Unityのアニメーション機能およびTimelineを使うとガクガクになってしまうので良い方法を探していました。 「ベジェ曲線で動かす方法ないかなあ」と思っていたら Cinemachine にそのものズバリな機能があったので喜んで導入した軌跡。

f:id:sugar_affordance:20190612112258g:plain

もうちょっとブンまわしてもよかったかも...

Cinemachine を導入

PackageManagerに入っているので導入しましょう。パケマネパケマネ。

f:id:sugar_affordance:20190612113148p:plain

VirtualCameraとDollyTrackを作成

映画とかでカメラマンを動かす台車のことを ドリー というらしいですね...

カメラドリー - Wikipedia

Cinemachine でもDollyという呼び方でパスを作成します。
メニューの Cinemachine から Create Dolly Camera with Track を選択。

f:id:sugar_affordance:20190612113203p:plain

Virtual Camera が一つと、Cinemachine Smooth Path が一つ作成されます。

パスを作成

Cinemachine Smooth Path のほうに Waypoint を追加していくと、デフォルトでベジェ曲線のレールがしかれていきます。

f:id:sugar_affordance:20190612113305p:plain

カメラの LookAt 位置を決める

Virtual Camera の LookAt を設定しないと、カメラがレールに対してまっすぐの方向を向きます。
今回は適当なGameObjectを作成して、Timelineで動かしました。

スクリプトでドリーの位置を設定する

使用したスクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Timeline;
using Cinemachine;

public class Timeline_DiskIntroductionCameraDolly : MonoBehaviour, ITimeControl
{
    [SerializeField]
    CinemachineVirtualCamera cvc;
    CinemachineTrackedDolly dolly;

    void Awake() {
        dolly = cvc.GetCinemachineComponent<CinemachineTrackedDolly>();
    }

    public void OnControlTimeStart() {
    }

    public void SetTime(double time) {
        dolly.m_PathPosition = (float)time  /1f;
    }

    public void OnControlTimeStop() {

    }
}

タイムラインのアニメーショントラックにしました。

VirtualCamera にはDollyのプロパティを持っていないので、GetCinemachineComponentコンポーネントを取得します。


ベジェ曲線は自然な動きっぽくなっていいですね

・Cinemachine クラスAPI

Class CinemachineVirtualCamera | Package Manager UI website

Class CinemachineTrackedDolly | Package Manager UI website


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。