【问题标题】:position check between object and point. Unity3D对象和点之间的位置检查。 Unity3D
【发布时间】:2019-03-14 10:08:06
【问题描述】:
    if (((float) (Math.Round(gameObject.transform.position.x, 1))) == ((float) (Math.Round(array[i].x, 1))) && (((float) (Math.Round(gameObject.transform.position.y, 1))) ==  (float) (Math.Round(array[i].y, 1))))

你好!我正在使用 C#,数组中填充了向量位置。我试图查看物体何时到达某个位置。这永远不会触发。你有任何其他提示如何做到这一点?

【问题讨论】:

  • 由于精度原因,它不会工作。你可以看看这个question,了解如何实现你想要的。

标签: unity3d


【解决方案1】:

您正在直接比较 float 的值……永远不要那样做。这会导致floating point precision 出现问题。 float 值实际上以 Epsilon 的增量在内部存储。

参见例如来自here

16.67最近的float16.6700000762939453125

100.02最近的float100.01999664306640625

here 以获得更广泛的解释。


使用Vector3.Distance

最好有一定的阈值距离。在Coroutines 中有一个示例看起来与您想要做的完全一样(在 JavaScript 中,但在这种情况下与 c# 的差异很小)

public float threshold = 0.1f;

//...

if(Vector3.Distance(gameObject.transform.position, array[i]) <= threshold)
{
    ....
}

调整threshold,使其值大于对象在两帧之间可能移动的值。

或与Mathf.Approximately一起使用

if(Math.Approximately(Vector3.Distance(object.transform.position, array[i]), 0.0f))
{
    ....
}

如果您的阈值小于0.00001,您也可以使用

if(object.transform.position == array[i])
{
    ....
}

因为== 使用&lt;= 0.00001 表示相等。

但请注意:在大多数情况下,最后两个选项也会失败,因为除非您在某处设置了固定值,否则选择移动游戏对象以匹配精确 3D 位置的选项几乎为 0。


Vector3.Distance 也可以使用 Vector2 作为参数,因为存在对 Vector3 的隐式类型转换。

【讨论】:

  • 谢谢!你知道为什么当我用以下语句包装 if 语句时我的程序崩溃:while(x==1) { if statement with x=0;
  • 很可能是因为您从未将对象移动到 while 循环中,或者由于任何其他原因它根本不匹配该位置?只在Update 中进行检查,而没有while .. Update si 调用每一帧就足够了。或结帐Coroutines(只是注意到实际上我上面提供的示例正是我使用Distance ;))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2017-04-15
相关资源
最近更新 更多