C# 而移动单位变换的无限循环
我程序的这一部分使Unity引擎崩溃,我很确定这是一个无限循环,但我不知道为什么或者如何修复它C# 而移动单位变换的无限循环,c#,unity3d,while-loop,C#,Unity3d,While Loop,我程序的这一部分使Unity引擎崩溃,我很确定这是一个无限循环,但我不知道为什么或者如何修复它 一般情况下,不要在中执行在每帧基础中应该执行的操作!(谢谢罗恩) 在最好的情况下,while的结果是,你的应用程序会阻塞,直到向量最终匹配,使对象“跳跃”到位。在最坏的情况下,他们永远不会匹配,你的应用程序永远冻结 相反,您应该使用称为“每帧”的方法,每帧只移动对象一步 要比较向量,最好使用。使用forVector3基本上是可以的,但在内部,它的作用相当于 while (transform.posit
中执行在每帧基础中应该执行的操作!(谢谢罗恩)
在最好的情况下,while
的结果是,你的应用程序会阻塞,直到向量最终匹配,使对象“跳跃”到位。在最坏的情况下,他们永远不会匹配,你的应用程序永远冻结
相反,您应该使用称为“每帧”的方法,每帧只移动对象一步
Vector3
基本上是可以的,但在内部,它的作用相当于
while (transform.position != new Vector3(desX, desY))
{
// 2 - Movement
Vector3 movement = new Vector3(
0.1f * desX,
0.1f * desY,
0);
//movement *= Time.deltaTime;
transform.Translate(movement);
}
Time.deltaTime
。如果没有这个,它将移动0.1米/帧
,但您的帧速率可能不稳定。使用Time.deltaTime
可以使其0.1米/秒
,这在几乎所有情况下都是您实际想要实现的transform.position = Vector3.MoveTowards(transform.position, new Vector3 (desX, desY), 0.1f);
请注意,在某些情况下,
向
移动仍然不够可靠,例如,如果您想跟踪碰撞或其他情况。在本例中,referent将冻结您的应用程序,因为当while
循环中的条件不满足时,您没有给其他脚本运行的机会
要修复此问题,请将该代码放入协程函数中,然后添加yield return null
切换到while
循环。这使得Unity在每个循环之后等待一个帧,因此给其他脚本运行每个帧的机会。无论while
循环是否退出,这都应该解决冻结问题。我还建议您使用Vector3.Distance
来确定何时接近目的地
float desX;
float desY;
float moveSpeed = 0.1f;
void Update()
{
var targetPosition = new Vector3 (desX, desY);
transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
}
如果您真的想随着时间的推移将游戏对象移动到另一个位置,请参阅文章。这可能是浮点比较的问题,这些值可能与您要检查的值不完全相同。@RonBeyer是对的。你到底想做什么?看起来你想把一个游戏物体移向一个位置。请看一看,您不应该使用while循环来统一移动对象,这就是Update方法的用途。1<代码>矢量3可以接受2个参数。第三个是0。这是为了从
Vector2
创建Vector3
。2.这在这里真的无关紧要。OP正在比较Vector3
而不是float
。有一个用于比较两个向量的内置重载。它不是比较浮动,而是检查它们的大小差异。3.您也可以使用while
循环来移动对象。我不知道还能说些什么,但这并不能解决问题。它展示了另一种解决方案,但没有解决当前问题。此外,浮点几乎从不相等(向量由浮点组成)。使用Mathf.approximaty
来比较它们。@DRACO18通常是的,但是比较Vector3
使用已经使用的近似值,在内部做一些比较Vector3.Distance(vectorA,vectorB,0.00001)
所以只需使用一个非常小的阈值
transform.position = Vector3.MoveTowards(transform.position, new Vector3 (desX, desY), 0.1f);
float desX;
float desY;
float moveSpeed = 0.1f;
void Update()
{
var targetPosition = new Vector3 (desX, desY);
transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
}
public float reachThreshold = 0.2f;
void Start()
{
StartCoroutine(MoveBject());
}
IEnumerator MoveBject()
{
float distance = Vector3.Distance(transform.position, new Vector3(desX, desY));
while (distance > reachThreshold)
{
// 2 - Movement
Vector3 movement = new Vector3(
0.1f * desX,
0.1f * desY,
0);
//movement *= Time.deltaTime;
transform.Translate(movement);
//Wait a frame
yield return null;
}
}