我一直致力于一个需要相当基本寻路的项目,经过相当多的努力和时间,它几乎可以工作。但是,有一个持久性错误。每当一个单元需要在障碍物上方路径时,它就没有问题,但是当它需要在下面路径时它会产生堆栈溢出。
守则:
在单元类
中public void drawMovePath(Tile tarTile)
{
for (int i = 0; i < moveableTiles.Count; i++) {
moveableTiles[i].GetComponent<SpriteRenderer>().color = Color.gray;
}
path.Clear ();
List<GameObject> availableTiles = new List<GameObject> ();
List<int> hValues = new List<int> ();
calcLists (availableTiles, hValues, tarTile.gameObject);
curTile.GetComponent<Tile> ().drawMovePathInit (tarTile.gameObject, availableTiles, hValues, path, speed);
for (int i = 0; i < path.Count; i++) {
path[i].GetComponent<SpriteRenderer>().color = Color.green;
print(path[i].GetComponent<Tile>().getHValue());
}
pathDrawn = true;
}
在瓷砖类中:
public void drawMovePathInit(GameObject tarTile, List<GameObject> allMoveableTiles, List<int> hValues, List<GameObject> path, int speed, int newHValue = 0)
{
GameObject curTile = Player.instance.getSelectedUnit ().GetComponent<Unit> ().getCurTile ();
curTile.GetComponent<Tile> ().setHValue (newHValue);
path.Add (curTile);
GameObject nextTile = new GameObject();
int lowestH = 100000;
for (int i = 0; i < curTile.GetComponent<Tile>().getSurTiles().Count; i++) {
int index = allMoveableTiles.IndexOf(curTile.GetComponent<Tile>().getSurTiles()[i]);
if (index != -1)
{
if (hValues[index] <= lowestH)
{
lowestH = hValues[index];
nextTile = allMoveableTiles[index];
}
}
}
nextTile.GetComponent<Tile> ().drawMovePath (tarTile, allMoveableTiles, hValues, path, speed, curTile.GetComponent<Tile>().getHValue());
}
public void drawMovePath(GameObject tarTile, List<GameObject> allMoveableTiles, List<int> hValues, List<GameObject> path, int speedLeft, int newHValue)
{
setHValue (newHValue + 10);
path.Add (this.gameObject);
if (this.gameObject == tarTile) {
return;
}
if (speedLeft == 0) {
return;
}
GameObject nextTile = new GameObject();
int lowestH = 100000;
for (int i = 0; i < surTiles.Count; i++) {
int index = allMoveableTiles.IndexOf(surTiles[i]);
if (index != -1)
{
if (hValues[index] <= lowestH)
{
lowestH = hValues[index];
nextTile = allMoveableTiles[index];
}
}
}
nextTile.GetComponent<Tile> ().drawMovePath (tarTile, allMoveableTiles, hValues, path, speedLeft - 1, getHValue());
}
在上面的图片中,代码工作正常,从所选单元找到路径到鼠标悬停的图块。
但是,在此图像中,代码无效。单元和鼠标之间没有形成路径。
这个问题与这样一个事实有关:一旦它决定了一条路径,它就会一直沿着这条路走下去。 &#34; if(speedLeft == 0)&#34;在Tile中的drawMovePath()中的escape子句是为什么在第二个图像中只显示1个tile。没有它,会产生堆栈溢出,因为路径查找在上升1,然后下降1,然后上升1,然后下降1等之间循环。
如果我删除了= in&#34; if(hValues [index]&lt; = lowestH)&#34;,那么我有相同的问题,只能反过来,它可以在障碍物下方寻路,但不是上方。
我真的因为这个问题而斗智斗勇,现在已经困扰了我近一个星期了。任何帮助将不胜感激。
提前致谢,
尼克