防止实体在头顶射击时堆叠在一起

本文关键字:在一起 射击 实体 | 更新日期: 2023-09-27 18:07:16

我正在制作一个头顶射击游戏,随着时间的推移,当我在舞台上绕圈移动时,敌人会开始堆叠在一起,直到它们成为一个巨大的单位堆叠。它最终看起来很傻。

AI非常简单和基本:找到玩家,向他移动,如果他在范围内就攻击他。

把它们彼此推开,使它们不会都在同一个地方结束的最好方法是什么?我认为蜂群有点杀伤力过大(可能太密集了,因为我的屏幕上一次会有100-200个敌人)。

想法?

谢谢!

防止实体在头顶射击时堆叠在一起

您可以采用以下几种不同的方法来解决这个问题:

  1. 您可以为每个单元定义一个势场,该势场将"高度"或"恶劣程度"与地图上的每个位置相关联。每个单位都在以一种尽量减少其潜力的方式移动,也许是朝着将其移动到最低潜力的方向迈出一步。你可以定义势能函数,让它向玩家倾斜,导致所有单位都试图向玩家移动,但也要在现有单位周围非常高,导致单位避免相互碰撞。这是一个非常强大的框架,在人工智能中一直被利用;一个著名的例子是伯克利Overmind在《星际争霸》AI中的使用,该AI最终赢得了《星际争霸》AI竞赛。如果你采用了这种方法,你就可以调整潜在的功能,让AI以许多其他有趣的方式行动,并且可以很容易地支持群集。我个人认为这是最好的方法,因为它是最灵活的。对于更高级的寻径模型来说,这也是一个很好的起点。关于AI潜在领域的非常好的实用介绍,请查看这个网站。要了解势场及其应用的严格数学介绍,您可能需要查看这篇论文,该论文调查了使用势场的不同人工智能方法。

  2. 如果你为每个敌人定义一个边界圈,你可以明确地禁止单位堆叠在彼此的顶部,防止任何两个单位在两个半径范围内。任何时候两个单位靠得太近,你要么可以阻止其中一个移动,要么可以让它们相互施加力使它们分开。当两个单元相互碰撞时,你可以随机选择一个力向量来作用于每个单元,试图将它们分开。这是一个比潜在字段更黑客和更不优雅的解决方案,但如果你需要启动和运行一些东西,这绝对是一个可行的选择。

  3. 你可以选择玩家周围的一组点,让单位尝试移动,然后让每个单位随机选择其中一个目标点移动。这将导致单位在玩家周围以环形(或任何你想要的形状)的形式展开,从而避免出现你目前所看到的大量单位。同样,这比使用势场要差得多,但如果你的目标是让某些东西快速工作,这是另一种可以尝试的快速hack。

希望这对你有帮助!