重写Equals()打破与null的比较?

时间:2014-12-27 16:10:19

标签: unity3d equals

我不太确定我做错了什么,特别是因为我重新实现了以前工作正常的东西,特别是用于寻路的AStar算法。我使用C#并在Unity中工作以防万一。我之前的实现与当前实现之间的主要区别在于我以前在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;
    }

这里是我确定tempNode.parent不为null,Debug语句在控制台中工作正常,我可以更深入地引用更多父项。我的代码永远不会进入while()循环(再次 - 这是我之前在早期实现中工作过的东西)。此外,如果我从&#34; tempNode.parent!= null&#34;切换,循环开始执行。 to&#34; tempNode.parent == null&#34;,在那个场景中,它完成所有步骤,在层次结构中的最后一个父节点上抛出空引用。 这是我使用的Override for 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();
}

任何人都知道我可能做错了什么?花了好几个小时试图解决这个问题,我们非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

毕竟,我已经设法自己解决了这个问题。如果有人遇到类似的问题,这里有一个解释:事实上,我在第一个实现中将节点作为单独的游戏对象组件,而在第二个实例中它们只是阵列中的实例区别。显然,每当脚本扩展Monobehavior时,它都需要用作游戏对象组件才能正常运行。一旦我从新的NavNode类中删除了Monobehavior扩展,我不再需要重写Equals()方法,默认方法就开始正常工作了。因此,导致我出现问题的空检查也开始正常工作。