我正在开发一款俯视角射击游戏。随着我在竞技场中绕圈移动,敌人会开始相互堆叠,最终形成一个巨大的单位堆。 这看起来非常滑稽。
AI 非常简单和基础:找到玩家,向他移动,并在他进入射程时攻击他。
有什么最好的方法可以将它们彼此推开,以免它们都堆叠在同一个位置? 我认为 flocking (群聚行为)有点过头了(而且可能太消耗性能了,因为我同时会在屏幕上有 100-200 个敌人)。
有什么想法吗?
谢谢!
回答:
以下是一些您可以用来解决此问题的不同方法:
-
您可以为每个单位定义一个势场,将“高度”或“糟糕程度”与地图上的每个位置相关联。 每个单位以试图最小化其势能的方式移动,例如,朝着使它在一个步骤中达到最低势能的方向移动一步。 您可以定义势函数,使其朝着玩家倾斜,从而导致所有单位都尝试向玩家移动,但同时在现有单位周围也非常高,从而导致单位避免相互碰撞。 这是一个非常强大的框架,在 AI 中经常被利用;一个著名的例子是它在《星际争霸》的 伯克利 Overmind AI 中的使用,该 AI 最终赢得了 AI 《星际争霸》比赛。 如果您采用这种方法,您可能会调整势函数以使 AI 以许多其他有趣的方式表现,并且可以轻松地支持群聚行为。 我个人认为这是最好的方法,因为它最灵活。 它也将是更高级寻路模型的良好起点。 要获得关于 AI 势场的非常好的实用介绍,请查看此网站。 要获得关于势场及其应用的严格数学介绍,您可能需要查看本文,其中调查了使用势场的不同 AI 方法。
-
如果您为每个敌人定义一个边界圆,您只需通过阻止任何两个单位之间的距离小于两个半径来明确禁止单位相互堆叠。 任何时候两个单位靠得太近,您都可以停止其中一个移动,或者让他们相互施加力以使它们分开。 当两个单位相互碰撞时,您可以选择一个随机力向量应用于每个单位,以尝试使它们分开。 这是一种比势场更糟糕且不那么优雅的解决方案,但如果您需要启动并运行某些东西,这绝对是一个可行的选择。
-
您可以选择玩家周围的一组点,让单位尝试向其移动,然后让每个单位随机选择其中一个目标点进行移动。 这将导致单位在玩家周围的环中(或您喜欢的任何形状)更稀疏地散布,从而避免了您迄今为止看到的大量堆叠。 同样,这远不如使用势场优雅,但如果您的目标是快速完成某些工作,这是您可以尝试的另一种快速方法。
希望这有帮助!