web-dev-qa-db-ja.com

Unity C#でオブジェクトを新しい位置にゆっくりと移動する

シーンに車のオブジェクトがあります。基本的な運転アニメーションをゆっくりと新しい位置に移動してシミュレートしたいのですが...以下のコードを使用しましたが、Lerpを間違って使用していると思いますか?少し前にジャンプして停止しますか?

void PlayIntro() {
    GameObject Car = carObject;
    Vector3 oldCarPos = new Vector3(Car.transform.position.x, Car.transform.position.y, Car.transform.position.z);
    GameObject posFinder = GameObject.Find("newCarPos");

    Vector3 newCarPos = new Vector3(posFinder.transform.position.x, posFinder.transform.position.y, posFinder.transform.position.z);

    carObject.transform.position = Vector3.Lerp (oldCarPos, newCarPos, Time.deltaTime * 2.0f);
}
6

コードには2つの問題があります。

  • Vector3.Lerpは単一の値を返します。関数は1回しか呼び出されないため、Lerpが返す位置を設定するだけです。代わりに、フレームごとに位置を変更することをお勧めします。これを行うには、 コルーチン を使用します。

  • Time.DeltaTimeは、最後のフレームから経過した時間を返します。これは通常、非常に小さい数値です。移動の進行状況に応じて、0.0から1.0の範囲の番号を渡す必要があります。

コードは次のようになります。

IEnumerator MoveFunction()
{
    float timeSinceStarted = 0f;
    while (true)
    {
        timeSinceStarted += Time.DeltaTime;
        obj.transform.position = Vector3.Lerp(obj.transform.position, newPosition, timeSinceStarted);

        // If the object has arrived, stop the coroutine
        if (obj.transform.position == newPosition)
        {
            yield break;
        }

        // Otherwise, continue next frame
        yield return null;
    }
}
10
Lokkij

簡単な解決策は、Lerp関数が実際にオブジェクトの位置を目的の位置に設定した直後です。

これがどのように見えるべきかです

carObject.transform.position = Vector3.Lerp (oldCarPos, newCarPos, Time.deltaTime * 2.0f);
carObject.transform.position = newCarPos;
0
Matt