【Unity】Unity2022からの公式スプラインパッケージ『Splines』で曲線・パスをシーンに簡単に作成する

Unity2022で追加されたスプラインツールの使い方を簡単にまとめました。

Unity2022.2.0b4
Splines 2.0.0-pre.2

はじめに

Unity2022で、Unity公式のスプラインツールがパッケージとしてリリースされました。
これを使うとシーン上に曲線を作成できます。
また、曲線の情報を使ってキャラを動かしたりモデルを配置したりといった使い方ができます。

本記事ではこのツールの使い方について簡単にまとめます。
(まだ仕様が変わりそうな予感もするので軽く触ります。)

インストール

インストールは Package Manager から行います。
Unity 2022以降で Package Manager を開き、Unity Registry から Splines をインストールします。

Package Manager

Package Manager の細かい使い方は省略しますが、以下の記事にまとめていますので必要に応じて参照してください。

light11.hatenadiary.com

スプラインを作る

それでは実際に使ってみます。
まずスプラインを作るには、Hierarchy から +ボタン > Spline > Draw Spline Tool… を選択します。

スプラインを作成

Spline という名前の GameObject が生成されるので、それを選択して Scene ビューのツールバーを以下のように設定します。

ツールバーを設定

するとクリックでポイント(knotと呼びます)を配置し、スプラインを作成できるようになります。
ポイントは連続で配置することができ、配置を終了する際には Escape キーを押下します。

knot配置

なおこのモードでは、GameObject に設定されているコライダーに沿って knot を配置することも可能です。

コライダーに沿って配置

スクリプトから制御する

次に作成したスプラインをスクリプトから使ってみます。
後述の通り、あらかじめ用意されたコンポーネントも存在しますが、理解のためにまずは自分でスクリプトを記述してみます。

using System.Collections;
using UnityEngine;
using UnityEngine.Splines;

public class Example : MonoBehaviour
{
    [SerializeField] private SplineContainer _spline;
    [SerializeField] private Transform _target;
    [SerializeField] [Range(0.0f, 1.0f)] private float _progress;
    [SerializeField] private float _speed = 0.3f;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
            StartCoroutine(MoveRoutine());
    }

    private IEnumerator MoveRoutine()
    {
        _progress = 0.0f;
        while (_progress < 1.0f)
        {
            _progress += Time.deltaTime * _speed;

            // Splineに進捗を渡して、その地点の座標や向きの情報を得る
            _spline.Evaluate(_progress, out var position, out var tangent, out var up);

            // Transformに反映
            _target.position = position;
            _target.up = up;
            _target.forward = tangent;

            yield return null;
        }

        _progress = 1.0f;
    }
}

_target をスプラインに沿って移動させるスクリプトです。
再生してSキーを押すとスプラインに沿って対象の GameObject が移動することを確認できます。
(冒頭のツイートではこのスクリプトを使って動かしています。)

アニメーションさせるSplineAnimateコンポーネント

さて、前節では Spline を使ったアニメーションを独自で実装しましたが、アニメーション用のコンポーネントはあらかじめ用意されています。
これを使用するには、アニメーションさせたい GameObject に SplineAnimate コンポーネントをアタッチします。

Spline に作成した Spline Containerアサインし、再生するか PreviewPlay ボタンを押下することで挙動を確認することができます。

挙動を確認

Spline上にGameObjectを生成するSplineInstantiateコンポーネント

Spline上に GameObject を生成する SplineInstantiate コンポーネントも用意されています。
が、このバージョンでは不具合があるようでうまく生成されませんでした。(設定したPrefabがシリアライズされず、何も生成されない)
サンプルシーンでは挙動をみることができるので、修正前のバージョンを使う場合にはサンプルで挙動を確認するといいかもしれません。

機能としてはいくつかの Prefab を特定の割合で生成したり、一定間隔・ランダムな感覚で生成したり、各インスタンスの Transform にオフセットをかけたりすることができます。

Spline Instantiate

Splineに沿ってチューブ型のメッシュを生成する Spline Extrude

Spline Extrude コンポーネントを使うと、下図のように Spline に沿ってチューブ型のメッシュを生成することができます。

Spline Extrude

関連

light11.hatenadiary.com

参考

docs.unity3d.com