在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

在Unity 3D (c#)中比较两个相同的对象返回false

尽管是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));

我知道它很啰嗦但至少它是有效的因为它是整数之间的简单比较。