【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名前空間にあります。

  1. using UnityEngine;
  2. using UnityEngine.Splines;
  3. using UnityEngine.InputSystem;
  4.  
  5. public class SplineTest : MonoBehaviour
  6. {
  7. [SerializeField] SplineAnimate splineAnimate;
  8.  
  9. void Update()
  10. {
  11. var current = Mouse.current;
  12. if (current != null)
  13. {
  14. // 左ボタンの入力状態取得
  15. var leftButton = current.leftButton;
  16.  
  17. // 左ボタンが押された瞬間かどうか
  18. if (leftButton.wasPressedThisFrame)
  19. {
  20. if (splineAnimate.IsPlaying)
  21. {
  22. // 停止する
  23. splineAnimate.Pause();
  24. }
  25. else
  26. {
  27. // 再生する
  28. splineAnimate.Play();
  29. }
  30. }
  31. }
  32. }
  33. }

コメントを残す

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