RTS游戏中的寻路如何工作?


42

[从stackoverflow交叉发布]

在《魔兽争霸3》或《帝国时代》等游戏中,AI对手在地图上移动的方式似乎几乎是无限的。地图很大,其他玩家的位置也在不断变化。

这些游戏中的AI寻路方式如何工作?在这种设置中,似乎无法使用标准的图形搜索方法(例如DFS,BFS或A *)。


2
为什么A *在此图中不起作用?
2011年


1
@tenfour,现在链接已断开。
蒙特利尔

Answers:


29

在大多数情况下,在导航网格物体(通常称为“ 导航网格 ”)上使用A *是商业RTS使用的寻路解决方案。还有就是navmeshes是如何工作的,为什么他们比航点系统更好的解决方案,并链接到执行资源,详细说明在这里

如果您打算开发特殊的游戏模式(点/节点捕获)或巡逻,掩护等单位,则可能需要在导航网格上方实现路标层,以控制AI行为(而不是寻路)。


17

看看Supreme Commander 2中使用的Flowfield算法。它比大多数RTS寻路系统做得更好(举几个例子,跳到0:50)。


4
那是一个非常酷的演示,但没有告诉我有关实现本身的信息
MetaGuru

4
他们在一句话中提到-这是基于西澳大学的人群流量研究,您可以在grail.cs.washington.edu/projects/crowd-flows中找到

流场算法似乎很有趣,并且绝对比大多数算法做得更好,但我希望公开的文档说明系统本身是如何工作的,而不仅仅是系统的工作原理。自然,在实施这样的核心系统之前,开发人员会提出很多问题,但是在这种情况下,似乎回答这些问题的唯一方法是首先实施该系统。:(
阿里·帕特里克

2
@Kragen:在普通的A *(尤其是航点)使它们相互碰撞之前,您实际上只需要两个单元,并且您需要某种系统来解决该问题。

5
根据视频,《星际争霸2》的寻路功能如下所示。SC2是否使用流场?
克里斯·布伊

7

许多较旧的游戏确实使用A *。原始星际争霸使用A *;导致在处理碰撞时出现一些问题。星际争霸2的手柄可以很好地处理碰撞,它具有游动/植绒的功能,可以保持对大型团体的流畅控制。 这篇 gamedev文章讨论了如何实现这一目标。


2

我已经同意她的其他回答,但也尝试将WoW / Warcraft3视为实际的2D世界。他们看不到与tilebased不同的地方,只是tile。

您还可以想到GPS如何找到最佳路径?有大量的算法可以通过链接地图进行寻路。

我认为某些第一个“ Quake bots”脚本也可以为您提供帮助,因为它们被开发为可在“未知领域”工作,因为我们可以从头开始设计自己的关卡。

总而言之,我个人处理此类地图的方式是将其视为A *探路者。但是首先我要预先计算每个“平铺点”,并用“最近邻居”等索引所有这些。然后,当一个对象需要从A移到B时,只需在B中进行查找,看看其连接的位置并一直重复直到您达到目标。

根据游戏类型和风景/场景,不同的预扫描策略也可能有用。有些游戏的障碍物很少,而这些障碍物可能是“直线运动” +一些“物体如何绕行”。

希望这有点道理,也许可以给您一些想法。


1

大多数游戏的确使用某种搜索算法或A *在地图上查找路径。显然,出于性能原因,对AI进行了某些方面的调整。

您会在《星际争霸2》中注意到这一点,其中Zerglings显然根本走不好,这对于Zerglings来说是CPU的噩梦。他们只是尽力做到从A到B,甚至没有试图找到最佳路径。它们将尽可能靠近,然后在节流阀或斜坡处达到瓶颈。


1

地图是一个网格。网格是图。A *适用于图,这是一种图搜索算法。A *应该搜索图的几个节点。

如前所述,他们可以使用导航网格。但是无论如何,A *(或类似的东西)都将在该网格的顶部,因为该网格的多边形只是图的节点;然后A *将搜索从一个多边形到另一个多边形的路径。

不确定魔兽或商业游戏,但也有一种称为协作扩散的技术,它非常简单;它通常在网格上完成。还有一种称为电位场的技术,如果不相同的话,它与先前的技术非常相似。

您也可以尝试:

  • 这些游戏中是否有一些可用的源代码
  • 这些游戏的某些克隆是否有可用资源
  • SDK或编辑器是否不暗示任何内容
  • 询问制作这些游戏的公司的雇主,其中一些人可能愿意分享

0

我完全没有经验,但是我认为一个好的解决方案是基于试探法,而不是对已知地图的完整检查。我能想到的启发式方法是基于本地和基于经验的。本地控制可以基于本地地形检查和障碍物,并保持朝着所需方向移动。我认为大多数地图都不需要复杂的迷宫般的动作,但是它们之间的联系非常紧密。另一个试探法是使用先前已知的路径(由其他单位探索或由用户明确地使用)将单位移动到已知或接近已知的位置。但是我说的是在大地图上移动,而不是像ZorbaTHut所说的那样在封闭的空间中移动。在拥挤的情况下,该算法可能会更复杂,需要某种“预测”,同一团队的各个部门之间的协调或仅仅是信号量式的等待策略。也,

我认为启发式算法是好的,因为它们通常会在较大的空间上以合理的计算时间(在移动多个单位时很重要)提供良好的解决方案。

抱歉,这是一个笼统的答案:我和很多人一起工作,但是空间非常特殊,我无法确切解释算法的工作原理(无论如何,它是基于代理的,不是全局定义的)。希望您能从我的回答中得到一些有用的想法。


嗯,我想知道我说的话有什么问题...很难发表评论吗?
AkiRoss

顺便说一句,我想强调一下A *使用启发式方法。感谢-2。
AkiRoss

您的答案为“沟A *及其类似物,然后自己滚”。那可能是一个合理答案的开始,但是除了建议之外,您提供的信息很少。它认为拒绝投票的原因是您不清楚解决方案的实施难度。我毫不怀疑,无限制时间的超级天才可以为给定的RTS编写代码/调整其路径算法,该算法在导航网格上优于A *。但是很难做到“天才”和“无限”。
deft_code

啊对。我以为那个家伙想要一个通用的答案,因为他不问如何制作答案,而是问他们一般如何工作。无论如何,我不是我所说的专家:我只是提供一些有关在通用IA应用程序中探索大型空间的解决方案的信息。谢谢你的评论。
AkiRoss 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.