Unity3d 重写Equals()会破坏与null的比较吗?
我不太确定我做错了什么,特别是因为我正在重新实现一些我以前工作得很好的东西,特别是用于寻路的AStar算法。我正在使用C#并在团结一致的情况下工作。我以前的实现和当前实现的主要区别在于,我以前在Unity中将导航节点作为独立的游戏对象,现在它们只是3d数组中的类实例。我遇到的第一个意外障碍是,这次我必须重写Equals()方法,以便List.Contains()能够正确响应所检查的不同节点(以前不需要)。覆盖有帮助,但后来我发现自己陷入了一个相当奇怪的问题(至少在这一点上对我来说)。现在有一段代码给我带来了问题:Unity3d 重写Equals()会破坏与null的比较吗?,unity3d,equals,Unity3d,Equals,我不太确定我做错了什么,特别是因为我正在重新实现一些我以前工作得很好的东西,特别是用于寻路的AStar算法。我正在使用C#并在团结一致的情况下工作。我以前的实现和当前实现的主要区别在于,我以前在Unity中将导航节点作为独立的游戏对象,现在它们只是3d数组中的类实例。我遇到的第一个意外障碍是,这次我必须重写Equals()方法,以便List.Contains()能够正确响应所检查的不同节点(以前不需要)。覆盖有帮助,但后来我发现自己陷入了一个相当奇怪的问题(至少在这一点上对我来说)。现在有一段代
public static List<Vector3> PrintPath (ref NavNode node, ref NavNode caller)
{
caller.parent = null;
List<Vector3> temp = new List<Vector3> ();
NavNode tempNode = node;
Debug.Log(tempNode.parent.parent.parent.position);
while (tempNode.parent!=null) {
temp.Add (tempNode.position);
Debug.Log (tempNode.position);
tempNode = tempNode.parent;
}
temp.Add (tempNode.position);
temp.Reverse();
return temp;
}
有人知道我可能做错了什么吗?花了几个小时试图弄明白这一点,任何帮助都将不胜感激。毕竟我自己已经设法弄明白了这一点。如果有人遇到类似的问题,这里有一个解释:事实上,我在第一个实现中将节点作为独立的游戏对象组件,而在第二个实现中,它们只是数组中的实例,这一点造成了差异。显然,每次脚本扩展Monobehavior时,都需要将其用作游戏对象组件,以便正常运行。一旦我从新的NavNode类中删除了Monobehavior扩展,我就不再需要重写Equals()方法,默认方法开始正常工作。结果,导致我出现问题的空检查也开始正常工作
public override bool Equals(System.Object obj)
{
if (obj == null)
{
return false;
}
NavNode node = (NavNode)obj;
if ((System.Object)node == null)
{
return false;
}
return (node.position.x == position.x) && (node.position.y == position.y) && (node.position.z == position.z);
}
public override int GetHashCode()
{
return base.GetHashCode();
}