C# 缓慢地将一个物体移动到单位C中的一个新位置#
我的场景中有一个汽车对象。我想模拟一个基本的驾驶动画,慢慢移动到一个新的位置。。。我使用了下面的代码,但我认为我使用Lerp是错误的?它只是向前跳一点然后停下来C# 缓慢地将一个物体移动到单位C中的一个新位置#,c#,unity3d,vector,C#,Unity3d,Vector,我的场景中有一个汽车对象。我想模拟一个基本的驾驶动画,慢慢移动到一个新的位置。。。我使用了下面的代码,但我认为我使用Lerp是错误的?它只是向前跳一点然后停下来 void PlayIntro() { GameObject Car = carObject; Vector3 oldCarPos = new Vector3(Car.transform.position.x, Car.transform.position.y, Car.transform.position.z);
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;
嗨@Matt,代码运行良好,但这样游戏对象移动速度变快,你知道我如何使移动速度变慢吗?我已经尝试将值2.0f从(Time.deltaTime*2.0f)更改为。提前谢谢