3

我正在开发一个游戏,我有多个敌人都朝着同一个目标移动。我遇到的问题是所有的敌人都走相同的路径到达这个目标,这导致了敌人的不切实际的“聚集”。我的问题是:我怎样才能让它们分散一点以产生拥挤效果?我目前正在使用 Unity 的内置 NavMesh 系统。我知道必须有一种方法来惩罚一个敌人使用的路径来鼓励其他敌人采取替代路径,但我只是不知道如何实现它。任何帮助表示赞赏!(另外,我最了解 C# 中的代码,但我可以在一定程度上理解 JavaScript)

4

2 回答 2

4

Radius您可以为每个代理随机设置不同的值。然后他们将采取不同的路线绕过障碍物。这不会改变在空白空间中它们的行为都相同的事实。

也许你也可以在目的地中引入一点随机性。但如果随机性太多,它会使代理看起来很愚蠢。

编辑:

对于某些游戏设计,一个好的方法可能是为一队特工进行导航,并为其中的每个成员从小队的中心进行位置偏移。如果代理彼此靠近,您还可以动态组建小队。

为了确定代理是否彼此如此接近,以至于他们应该动态地组成一个小队,您不需要在每个代理的每次更新中循环遍历所有其他代理。

首先,根据游戏的强度,可以在每 10-100 次更新左右进行距离测试。

其次,您可以使用特殊的数据结构来存储对所有代理的引用。例如,如果游戏区域是固定的,则可以将其划分为相同大小的区域。可以有 2D(或 3D)向量数组,其中存储了相应区域中的所有代理。然后一个代理只需要测试同样在同一向量或相邻向量中引用的其他代理。当然,在代理移动时需要更新引用。

如果小队中已经有特工,只针对小队进行测试可能就足够了,而不是针对其中的每个成员。

于 2014-10-30T07:11:30.343 回答
2

我会创建一个名为“Formation”的游戏对象。在此编队对象中根据需要制作尽可能多的子对象,以模拟所需的敌人放置位置。将每个子放置 GameObject 放置为紧密结合 - 或 - 根据您的需要稀疏填充。稀疏的人口(距离编队 GameOject 中心的距离更大)将导致僵尸通过障碍物采取不同的路径,因为它们的最短距离会随着你移动编队 GO 而改变。

在这种情况下,对于每个敌方僵尸,让僵尸的 NavMeshAgent 目标成为他们在编队 GameObject 中对应的 GameObject 位置。在这种情况下,在编队上放置一个 NavMeshAgent 似乎会产生一些令人不快的僵尸抖动。然而,简单地将阵型缓慢地移向目标打法似乎会产生合理的 5 分钟结果。

如果您想为您的阵型添加变化,也许要添加暴民心态,只需在每个阵型中添加一个“Bob”类型的脚本,以使僵尸在阵型中的目标位置稍微偏离中心,等等。

这也使得通过简单地切换他们在小队中的目标位置(对于其他游戏类型)来交换小队中的敌人角色变得微不足道。

于 2015-12-10T04:53:27.900 回答