我想在 x 秒内和协程函数中将GameObject从位置 A 移动到 B。Vector3.MoveTowards
我知道如何做到这一点,Vector3.Lerp
但这次更愿意这样做,Vector3.MoveTowards
因为这两个函数的行为不同。
使用Vector3.Lerp
,这样做是这样的:
IEnumerator moveToX(Transform fromPosition, Vector3 toPosition, float duration)
{
float counter = 0;
//Get the current position of the object to be moved
Vector3 startPos = fromPosition.position;
while (counter < duration)
{
counter += Time.deltaTime;
fromPosition.position = Vector3.Lerp(startPos, toPosition, counter / duration);
yield return null;
}
}
我试图用 做同样的事情Vector3.MoveTowards
,但它不能正常工作。问题是移动在 x 时间或持续时间之前完成。此外,它的移动也不是很顺畅。它跳到两个位置的中间而不是位置 B 的末端。
这是Vector3.MoveTowards
与上述问题一起使用的功能:
IEnumerator MoveTowards(Transform objectToMove, Vector3 toPosition, float duration)
{
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
Vector3 currentPos = objectToMove.position;
float time = Vector3.Distance(currentPos, toPosition) / duration;
objectToMove.position = Vector3.MoveTowards(currentPos, toPosition,
time);
Debug.Log(counter + " / " + duration);
yield return null;
}
}
如何Vector3.MoveTowards
在 x 秒内并在协程函数中将 GameObject 从位置 A 移动到 B?
请不要建议Vector3.Lerp
,因为那不是我想要使用的。
编辑:
更换
float time = Vector3.Distance(currentPos, toPosition) / duration;
和
float time = Vector3.Distance(startPos, toPosition) / (duration * 60f);
有效,但当焦点从 Unity 转移到另一个应用程序时会引入问题。这样做会导致运动无法完成。在开始计时器之前每帧而不是一次计算它似乎更合理。
MatrixTai 的回答解决了这两个问题。