在 Unity C# 中缓慢地将对象移动到新位置

本文关键字:新位置 位置 移动 对象 Unity 缓慢 | 更新日期: 2023-09-27 18:32:42

我的场景中有一个汽车对象。我想通过慢慢地将其移动到新位置来模拟基本的驾驶动画......我使用了下面的代码,但我认为我用错了 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);
}

在 Unity C# 中缓慢地将对象移动到新位置

您的代码有两个问题:

  • Vector3.Lerp返回单个值。由于您的函数只会被调用一次,因此您只需将位置设置为Lerp返回的任何值。您需要改为每帧更改位置。为此,请使用协程。

  • Time.DeltaTime 返回自上一帧以来经过的时间,这通常是一个非常小的数字。您将需要传入从0.01.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;
    }
}

一个简单的解决方案是在 Lerp 函数实际将对象的位置设置为所需位置之后立即

这是它应该是什么样子

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