在Unity C#中缓慢移动一个物体到新位置

7

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

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
12

你的代码有两个问题:

  • 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;
    }
}

1

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

下面是示例代码:

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

嗨,@Matt,代码运行良好,但是这样游戏对象移动得太快了,你知道如何使移动变慢吗?我已经尝试过从(Time.deltaTime * 2.0f)更改值2.0f。提前致谢。 - Zilev av

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,