【问题标题】:Preventing entities from stacking on top of eachother in an overhead shooter防止实体在头顶射击游戏中堆叠在一起
【发布时间】:2025-12-11 00:40:01
【问题描述】:

我正在开发一款头顶射击游戏,随着时间的推移,当我在竞技场周围转圈时,敌人将开始堆叠在一起,直到它们成为一大堆单位。结果看起来很傻。

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

最好的方法是什么可以将它们彼此推开,以免它们最终都在同一个地方?我认为植绒有点矫枉过正(而且可能过于密集,因为我一次将有 100-200 个敌人出现在屏幕上)。

想法?

谢谢!

【问题讨论】:

    标签: c# algorithm xna artificial-intelligence


    【解决方案1】:

    您可以采取以下几种不同的方法来解决此问题:

    1. 您可以为每个单元定义一个潜在字段,将“高度”或“坏度”与地图上的每个位置相关联。每个单元都以一种试图将其潜力最小化的方式移动,也许是朝着一个方向迈出一步,使其一步步达到最低潜力。您可以定义势函数,使其向玩家倾斜,导致所有单位尝试向玩家移动,但在现有单位周围也非常高,导致单位避免相互碰撞。这是一个非常强大的框架,在人工智能中一直被利用;一个著名的例子是它在星际争霸的Berkeley Overmind AI 中的使用,它最终赢得了人工智能星际争霸比赛。如果您确实采用了这种方法,那么您可能会调整潜在功能以使 AI 以许多其他有趣的方式运行,并且可以轻松支持集群。我个人认为这是最好的方法,因为它是最灵活的。对于更高级的寻路模型,这也是一个很好的起点。如需非常很好且实用的 AI 潜在领域介绍,请查看this website。如需对潜在领域及其应用的严格数学介绍,您可能需要查看this paper 调查使用潜在领域的不同 AI 方法。

    2. 如果您为每个敌人定义了一个边界圆,您可以通过阻止任何两个单位彼此相距两个半径的距离来明确禁止这些单位堆叠在一起。任何时候两个单位靠得太近,你都可以阻止其中一个单位移动,或者让它们相互施加力量以将它们分开。当两个单元相互碰撞时,您可以选择一个随机力矢量来应用到每个单元以尝试将它们分开。与潜在领域相比,这是一个更复杂且不太优雅的解决方案,但如果您需要启动并运行某些东西,它绝对是一个可行的选择。

    3. 您可以选择玩家周围的一组点,让这些单位尝试移动,然后让每个单位随机选择其中一个目标点移动。这将导致单位在玩家周围的环形(或您想要的任何形状)中更薄地分布,避免您目前看到的巨大质量。同样,这远不如使用潜在字段优雅,但如果您的目标是让某些东西快速工作,这是您可以尝试的另一种快速技巧。

    希望这会有所帮助!

    【讨论】:

    • +1;很棒的选择,优先考虑答案,引用参考文献(第一个选项)。
    • +1 以获得非常好的答案。我们为我们的竞技场射击游戏 Square Off 使用了选项 3 的变体。敌人会周期性地重新计算他​​们的方向,通常是朝向玩家(如果它们可见)或朝向 AI 节点(如果玩家不可见)。那时,我们只是简单地添加了一个随机量的垂直于它们方向的速度。这会导致敌人通常向玩家移动,但避免了恼人的聚集。是的,这是一个 hack,但它在 CPU 方面非常简单高效。
    • 如果他们移动,这不会让你的人错过目标吗?还是像疯了一样到处乱晃?