我不太确定我做错了什么,特别是因为我重新实现了以前工作正常的东西,特别是用于寻路的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();
}
任何人都知道我可能做错了什么?花了好几个小时试图解决这个问题,我们非常感谢任何帮助。
答案 0 :(得分:0)
毕竟,我已经设法自己解决了这个问题。如果有人遇到类似的问题,这里有一个解释:事实上,我在第一个实现中将节点作为单独的游戏对象组件,而在第二个实例中它们只是阵列中的实例区别。显然,每当脚本扩展Monobehavior时,它都需要用作游戏对象组件才能正常运行。一旦我从新的NavNode类中删除了Monobehavior扩展,我不再需要重写Equals()方法,默认方法就开始正常工作了。因此,导致我出现问题的空检查也开始正常工作。