MRが楽しい

MRやVRについて学習したことを書き残す

SmoothStepを使って目的地に徐々に加速し、徐々に減速して到達する

本日は Unity の小ネタ枠です。
SmoothStepを使って目的地に徐々に加速し、徐々に減速して到達する方法について記事にします。

目的地に到達する

Unity では Lerp 関数を使って徐々に現在地から目的地に到達するような動作を実装することができます。
docs.unity3d.com

ただし本関数は線形補完のため、第三引数をただ経過時間に合わせて代入するだけだと一定の速度で目的に到達する動きになります。
・LertTest.cs

using UnityEngine;

public class LertTest : MonoBehaviour
{
    private Vector3 startPosition;
    private Vector3 endPosition;
    private float moveTime = 5f;
    
    void Start()
    {
        startPosition = new Vector3(0f, 0f, 0f);
        endPosition = new Vector3(20f, 0f, 0f);
    }

    private void Update()
    {
        this.transform.position = Vector3.Lerp(startPosition, endPosition, Time.time / moveTime);
    }
}


目的地に徐々に加速し、徐々に減速して到達する

Unity の Mathf.SmoothStep メソッドを利用すると最小値から最大値の間でスムージング補完を行った値を取得できます。
docs.unity3d.com

このため、本メソッドを下記のように Lerp の第三引数に合わせて使用するだけで、徐々に加速して徐々に減速する動作が実現できます。

using UnityEngine;

public class LerpSmoothStepTest : MonoBehaviour
{
    private Vector3 startPosition;
    private Vector3 endPosition;
    private float moveTime = 5f;
    
    void Start()
    {
        startPosition = new Vector3(0f, 0f, 0f);
        endPosition = new Vector3(20f, 0f, 0f);
    }

    private void Update()
    {
        // Mathf.SmoothStepでLerpの補完をスムージングする
        this.transform.position = Vector3.Lerp(startPosition, endPosition, Mathf.SmoothStep(0, 1,Time.time / moveTime));
    }
}