【Unity】Splinesで簡単にパスに沿って移動させる

投稿者: | 2023-12-04

Splinesを使って、車のゲームオブジェクトをパスに沿って移動させてみました。

Splinesで簡単に曲線を作るで車が通るためのパスを作ります。

Spline Animateコンポーネント

スプラインに沿ってゲームオブジェクトを移動させるには、「Spline Animate」コンポーネントを使います。車にSpline Animateコンポーネントをつけると車が地面に埋まります。

そこで、空のゲームオブジェクトを作り、車の親にしました。

空のゲームオブジェクトにSpline Animateコンポーネントを付けます。

Spline Animateコンポーネントの「Spline」に、シーンにあるスプラインゲームオブジェクトをアタッチします。

車の親のゲームオブジェクトを地面と同じ高さにして、子の車を真上に移動し、タイヤが地面に接触するように置きます。

車のオブジェクトには、余分な移動や回転を作らないようにします。

親のゲームオブジェクトを見ると、上方向がYで、前方向が-Xでした。

なので、Spline AnimateコンポーネントのForward Axisを「Object X-」にしました。Methodを「Time」にすると、スプラインを一周する時間を指定できます。

Play On Awakeのチェックを入れると、でプレイモードに入ったときに自動でアニメーションが開始されます。

向きを調整

Align Toを「Spline Element」にすると、スプラインの方向に整列します。

「Spline Object」にすると、スプラインゲームオブジェクトの向きにForward Axisが向くようです。ゲームオブジェクトのZの方向が車の -X になっています。

ゲームオブジェクトの向き
車の向き

「World Space」にすると、ワールド空間のZ方向に、車の -X を向けます。

「None」だと整列されないので、車は直前の向きでスタートするようです。移動中に自由に回転させることができます。

開始オフセット

Start Offsetで開始位置を設定できます。

Start Offset : 0
Start Offset : 0.5
Start Offset : 1

Start Offsetを0.5で一度だけ再生すると、スプラインの中間で始まり、始点を通過して、中間あたりで終了します。

速度を設定

Methodでアニメーションの速度を変更できます。Methodを「Time」にすると、その下のDurationで、一周に要する時間を秒単位で設定できます。

「Speed」にすると、speedでアニメーションの速度を設定できます。

Easing

Easingモードでアニメーションの速度を変化させ、より自然な動きを作れます。Noneだと変化しません。

Ease In Only
Ease Out Only
Ease In-Out

ループモード

Loop Modeを「Once」にすると、一度だけ再生されます。「Loop Continuous」にするとループ再生されます。

「Ease In Then Continuous」では、Easingに「Ease In Only」や「Ease In-Out」が設定されている時、一度目のアニメーションにのみ、Easingが適用されます。

「Ping-Pong」にすると、アニメーションが言ったり来たりします。Easingも適用されています。

スクリプトから再生

PlayOnAwakeのチェックをオフにして、SplineAnimateをスクリプトから再生してみます。UnityEngine.Splines名前空間にあります。

using UnityEngine;
using UnityEngine.Splines;
using UnityEngine.InputSystem;

public class SplineTest : MonoBehaviour
{
    [SerializeField] SplineAnimate splineAnimate;

    void Update()
    {
        var current = Mouse.current;
        if (current != null)
        {
            // 左ボタンの入力状態取得
            var leftButton = current.leftButton;

            // 左ボタンが押された瞬間かどうか
            if (leftButton.wasPressedThisFrame)
            {
                if (splineAnimate.IsPlaying)
                {
                    // 停止する
                    splineAnimate.Pause();
                }
                else
                {
                    // 再生する
                    splineAnimate.Play();
                }
            }
        }      
    }
}

コメントを残す

メールアドレスが公開されることはありません。