在 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);
}
您的代码有两个问题:
-
Vector3.Lerp
返回单个值。由于您的函数只会被调用一次,因此您只需将位置设置为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;
}
}
一个简单的解决方案是在 Lerp 函数实际将对象的位置设置为所需位置之后立即
这是它应该是什么样子
carObject.transform.position = Vector3.Lerp (oldCarPos, newCarPos, Time.deltaTime * 2.0f);
carObject.transform.position = newCarPos;