2015-05-20 3 views
3

Я пишу сценарий C# на Unity 3D. У меня есть два Vector3, которые одинаковы. Когда я это сделаю:Сравнение двух идентичных объектов возвращает false в Unity 3D (C#)

Debug.Log(vect1); 
Debug.Log(vect2); 

Получаю тот же результат (500.0, 150.0, 0.0). Проблема в том, что когда я делаю vect1.Equals(vect2), я получаю ложь! Как это возможно?

P.S. Я уверен, что они оба Vector3, потому что когда я делаю vect1.GetType() и vect2.GetType() Я всегда получаю Vector3.

+3

Забавная вещь Vector.equals (Vector) возвращает истину, если значение имеет тот же X и Y значения как этот вектор; в противном случае - false. но Vector3.equals (Vector3) возвращает true, если текущий экземпляр равен указанному объекту; в противном случае - false. –

+0

@MeAndSomeRandoms, добро пожаловать на обед всей собаки, который является системой C# '.Equals()' и '==' C#. :( –

+0

Может быть, хуже. По крайней мере, у нас есть MSDN! –

ответ

4

Несмотря на то, что struct, Vector3 реализует Equals посредством сравнения идентичности. Другими словами, vect1 будет равен vect2, если они являются одним и тем же экземпляром.

Однако Vector3 действительно реализует == для проверки равенства значений, поэтому используйте это вместо этого.

Для получения более подробной информации см. https://msdn.microsoft.com/en-us/library/vstudio/ms128863%28v=vs.90%29.aspx.

+0

Где на странице, на которую вы ссылаетесь, это говорит о том, что 'Equals' выполняется по идентификатору ссылки? –

+0

Vector3, который использует Unity, не является документацией, на которую вы ссылались. собственный класс Vector3 (тот, который вы указываете, находится в Microsoft.WindowsMobile.Пространство имен DirectX) документация о единичном документе 3 здесь находится http://docs.unity3d.com/ScriptReference/Vector3.html –

1

Vector3overrides the == operator для "return true для векторов, которые действительно близки к равным". Так как вы можете иметь некоторые незаметные различия в ваших значений с плавающей точкой, вы можете попробовать использовать == вместо:

vect1 == vect2 
+0

Я только что пробовал vect1 == vect2, и я всегда получаю false – nix86

1

Вот почему вы могли видеть, что происходит

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)

Ложные

Ложные

Правда

Вопрос заключается в том, что ваше определение достаточно близко, может отличаться от Юнити. Вы можете проверить это, используя эту функцию.

public static bool AlmostEqual(Vector3 v1, Vector3 v2, float tolerance) 
{ 
    return Mathf.Abs(Vector3.Distance(v1, v2)) <= tolerance; 
} 
-1

Привет, ребята, я расскажу вам, как я решил проблему до сих пор. Я сделал член для сравнения членов.

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)); 

Я знаю, что это многословным, но по крайней мере это работает потому что это простое сравнение между целыми числами ...

+0

Вы не сравниваете два вектора, но вы сравниваете их членов. – nix86

+0

Хуже того, вы сравниваете округленные значения! – aggsol

+0

да, но beacause в моей игре блок движется дискретно, фиксированной длиной – nix86

Смежные вопросы