在Unity 3D (c#)中比较两个相同的对象返回false
本文关键字:对象 false 返回 两个 3D Unity 比较 | 更新日期: 2023-09-27 17:50:17
我在Unity 3D上写一个c#脚本。我有两个相同的Vector3
。当我这样做的时候:
Debug.Log(vect1);
Debug.Log(vect2);
我得到相同的结果(500.0, 150.0, 0.0)
。问题是,当我做vect1.Equals(vect2)
我得到假!这怎么可能?
注:我确信它们都是Vector3
,因为当我做vect1.GetType()
和vect2.GetType()
时,我总是得到Vector3
。
尽管是struct
, Vector3
通过身份比较实现Equals
。换句话说,vect1
只等于vect2
,如果它们是相同的实例。
但是,Vector3
确实实现了==
来测试值是否相等,所以用它来代替。
Vector3
覆盖了==
运算符"对于非常接近相等的向量返回true "。由于您的浮点值可能有一些难以察觉的差异,您可以尝试使用==
来代替:
vect1 == vect2
你可以看到发生了什么
Vector3 v1 = new Vector3(150.001f, 150.002f, 150.003f);
Vector3 v2 = new Vector3(150.002f, 150.003f, 150.004f);
Debug.Log(v1);
Debug.Log(v2);
Debug.Log(v1 == v2);
Debug.Log(v1.Equals(v2));
Debug.Log(Vector3.Distance(v1, v2) > 1e-3f);
这将输出
(150.0, 150.0, 150.0)
(150.0, 150.0, 150.0)
假
假真正
问题在于你对足够接近的定义可能与unity的定义不同。您可以使用这个函数
来检查。public static bool AlmostEqual(Vector3 v1, Vector3 v2, float tolerance)
{
return Mathf.Abs(Vector3.Distance(v1, v2)) <= tolerance;
}
嗨,伙计们,我告诉你们到目前为止我是如何解决这个问题的。我已经做了成员间的比较。
int vect1x=(int)vect1.x;
int vect1y=(int)vect1.y;
int vect1z=(int)vect1.z;
int vect2x=(int)vect2.x;
int vect2y=(int)vect2.y;
int vect2z=(int)vect2.z;
Debug.Log((vect1x==vect2x)&&(vect1y==vect2y)&&(vect1z==vect2z));
我知道它很啰嗦但至少它是有效的因为它是整数之间的简单比较。