2D Sidescroller中的A *寻路

时间:2014-12-01 18:48:16

标签: unity3d 2d artificial-intelligence a-star procedural-generation

我目前正在尝试在2D-sidescroller程序生成的世界游戏中使用A *寻路(想想类似Terraria的地形)。

我一直在使用这个资源:http://www.redblobgames.com/pathfinding/a-star/introduction.html

并且主要使用以下伪代码:

frontier = PriorityQueue()
frontier.put(start, 0)
came_from = {}
cost_so_far = {}
came_from[start] = None
cost_so_far[start] = 0

while not frontier.empty():
   current = frontier.get()

   if current == goal:
      break

   for next in graph.neighbors(current):
      new_cost = cost_so_far[current] + graph.cost(current, next)
      if next not in cost_so_far or new_cost < cost_so_far[next]:
         cost_so_far[next] = new_cost
         priority = new_cost + heuristic(goal, next)
         frontier.put(next, priority)
         came_from[next] = current

我的问题是:在具有大型程序生成世界的2D-sidescroller中,我该如何选择边界?特定图块的路径可以是任何距离,迭代整个地图显然是不明智的。

我正在努力做到这一点,所以任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:1)

我从来没有听说过它被称为&#34; frontier&#34;它始终是&#34;打开列表&#34;你把所有可以前往的地方 - 邻居放在那里。

我使用的性能方面:

1)将计算放在另一个线程中:(不是常规)在这里查看ThreadedJob http://answers.unity3d.com/questions/357033/unity3d-and-c-coroutines-vs-threading.html 它会产生延迟 - 结果将是你打电话后的几帧,或者:a)等待; b)开始沿目标的大致方向前进,并在结果准备好后改变路径; c)转到路径的第一个节点,即使剩下的还没有准备好。

2)缓存结果:Dictionary<Vector4, List<Vector2>> pathCache;其中键,Vector4为startPosXstartPosYfinishPosXfinishPosY,值List为A *的结果。 由于路径是对称的,因此当您查找从A到B的路径时,还应检查B-> A的缓存并反转路径。