1 回答
TA贡献1868条经验 获得超4个赞
因为我很长时间没有接触过 Unity ......但我相信你在计算中搞砸了。
首先,Vector3.MoveTowards(currentPos, toPosition, time)正在谈论
每帧从currentPos到toPosition移动一定距离time。
因此使用timeas name 是令人困惑的,但很好,让我们保留它。
然而,你会注意到在语句中,time每帧都是移动的东西。但是Vector3.Distance(currentPos, toPosition) / duration是速度(m/s),而不是(m/frame)。要使其(m/frame),只需乘以Time.deltatime(s/frame)即可。
其次,
在协程中时,这意味着该函数在每一帧中进行迭代。在该行中float time = Vector3.Distance(currentPos, toPosition) / duration * Time.deltatime;,您会注意到time随着距离越来越小,在下一帧时不断减少。
更具体地说,我们可以做一些数学运算。通常这应该用微积分来完成,但让我们通过只考虑 2 点来简化它。当对象位置 d = 0 且对象位置 d ~= 9.9 时,假设端点为 10。
在点 1 处,对象具有time= (10-0)/duration,全速。在第 2 点,物体有time= (10-9.9)/duration,全速的 1/10。
除非您希望它每帧移动得更慢,否则您不能保持持续时间的值不变。由于在每一帧之后,您希望保持速度,因此持续时间应该随着距离的增加而减少。
为了使物理起作用,减去经过的时间的持续时间。
所以最终的解决方案是
float time = Vector3.Distance(currentPos, toPosition) / (duration-counter) * Time.deltaTime;
这是完整的功能:
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 - counter) * Time.deltaTime;
objectToMove.position = Vector3.MoveTowards(currentPos, toPosition, time);
Debug.Log(counter + " / " + duration);
yield return null;
}
}
- 1 回答
- 0 关注
- 344 浏览
添加回答
举报