【Unity】Cinemachine 3 の「Spline Cart」を用いてオブジェクトの動きを簡単に制御する
概要
1年ほど前,Unity開発を行う中で,「オブジェクトをある経路に沿って動作させ,制御したい」という状況でCinemachine Dolly Cartコンポーネントが有用であると知りました。このコンポーネントを利用した方法の記事は多く,私自身もその手法を使用していました。しかし,2023年以降の最新バージョン「Cinemachine 3」ではCinemachine Dolly Cartではなく,UnityのSplineを利用した制御方法(Cinemachine Spline Cart)に変更になっているようです。
そこで本記事では,Cinemachine 3を用いた「オブジェクトを経路に沿って移動させる」方法をまとめておきたいと思います。
本記事の目的
- Cinemachineの概要を理解する
- Unity 6とCinemachine 3を用いたオブジェクト制御の方法を理解する
- スクリプトから「オブジェクトの移動速度制御」ができるようになる(簡単なデモ有り)
動作環境
- Unity 6 (6000.0.23f1)
- Cinemachine 3.1.3
- Splines 2.6.1
Cinemachine と Cinemachine Spline Cart
Cinemachine とは
Cinemachineは,「Unityカメラを制御するためのモジュールスイート」です(公式)。その言葉通り,ゲーム作成時等において必要なカメラワークを簡単な設定で作成できるという,Unityの公式モジュールです。
「バーチャルカメラ」を設定したPathに沿って動かすことができ,Cinemachine 3.xバージョンからはそのパスにSpline(スプライン)が標準でサポートされています。(Cinemachine 2.xまでは,Pathの設定の標準がスプラインではなかったため,古い記事だと説明されていないことが多いです。両者違いの説明は,こちらの記事がわかりやすいです。)
Cinemachine Spline Cart(旧:Cinemachine Dolly Cart)
Cinemachineの主な使い方は,上記で述べたように「スプラインに沿ってカメラを動かす」ことですが,「スプラインに沿って指定したオブジェクトを制御する」ということも可能です。
その際に用いるコンポーネントが「Cinemachine Spline Cart」です。
Cinemachine 3.xの従来(2.x)からの変更点
変更点はいくつかあるようです。詳しい内容は以下の公式が出している記事に説明があります。
Unityプロジェクトへの導入手順
(1)インストール
UnityのWindow > Package Managerを開き,Unity Registryで"Cinemachine"検索し,インストールを行います。
(2)Dolly Cartを作成
HierarchyからCinemachineを選択できるようになっていることを確認します。「Hierarchy > Cinemachine > Dolly Cart with Spline」を作成。
(3)動かしたいオブジェクトを子オブジェクトにする
今回は,動かしたいオブジェクトを「Vehicle Root」とします。図のようにメインカメラもDolly Cartの子孫オブジェクトにすることで一緒に動かすことができます。
また,同時に「Dolly Spline」も追加されていると思います。「移動する経路を設定する」Spline用のオブジェクトです。これで,準備は完了です。
実際に触ってみる【デモ】
(1)Splineの設定(制御点:Knots のマッピング)を行う
Dolly SplineのSpline Containerから,移動させたい経路をKnotを用いてマッピングします。今回は動作確認のため,直線経路をとりあえず作成しました。
Spline ContainerやSpline,Knotについては,Unityの「Spline」の理解が必要となります。詳しい説明は本記事では省きます。(Spline ContainerにいくつかのSplineを配列として保持し,その各Splineが制御点であるKnotを配列で保管しているという感じです。)
Scene
Inspector
(2)Dolly Cartの設定と制御変数
Cinemachine Spline Cartに,いくつか操作用の変数が用意されています。またこれら変数は他のスクリプトから操作することもできます。
- Spline: 移動時に沿わせたいスプラインをアタッチ(Dolly Cart作成時は自動でアタッチ)
-
Position: スプライン上の位置を指定したPosition Unitに従って保持する変数
- Position Units(Knots, Distance, Normalized): 位置の測定単位
- Update Method: 速度がゼロ以外の場合、カートをいつ動かすかを指定する。通常の更新にはUpdateまたはLateUpdate,Physicsモジュールと同期した更新にはFixed Update
- Automatic Dolly: スプラインに沿った自動モーションが発生するかどうかを制御(今回は使用しない)
(3)スクリプトから動作を制御する
速度を制御する以下のスクリプトを,空のオブジェクトにアタッチします。今回はSpline Cart Moverにしました。
using UnityEngine;
using Unity.Cinemachine;
public class SplineCartMover : MonoBehaviour
{
[SerializeField] CinemachineSplineCart cinemachineSplineCart;
[SerializeField] float cartSpeed;
// Update is called once per frame
void Update()
{
if (cinemachineSplineCart != null)
{
// スプラインの長さを取得
float splineLength = cinemachineSplineCart.Spline.CalculateLength();
// 経路上の現在位置(0〜1)を時間経過で進める
float deltaDistance = cartSpeed * Time.deltaTime;
float deltaT = deltaDistance / splineLength;
cinemachineSplineCart.SplinePosition += deltaT;
}
}
}
今回はインスペクタで指定した速度で移動するようにしていますが,プロジェクトによってはこの変数(cartSpeed)を他のスクリプトから動作するなどして柔軟に対応します。
Inspector
Cinemachine Spline Cartに移動させたいDolly Cartをアタッチ,Cart Speedで移動速度を指定します。今回は距離単位をDistanceにしているので,速度の単位は[m/s]です。
(4)動作確認
無事に動かすことができました。
おわりに
今回の方法を用いて,車や乗り物等のオブジェクトの移動制御が簡単になりそうです。Cinemachineのメイン機能であるカメラの制御は,もう少し勉強したいと思います。
Discussion