我正在制作一个游戏,我有多个敌人都向同一个目标移动。我遇到的问题是所有的敌人都采用相同的方式来达到这个目标,这导致了一个不切实际的“聚集”。敌人我的问题是:我怎样才能让它们分散一点以产生拥挤效应?我目前正在使用Unity内置的NavMesh系统。我知道必须有办法惩罚一个敌人用来鼓励其他敌人采取替代路径的路径,但我只是不知道如何实现它。任何帮助表示赞赏! (另外,我理解c#中最好的代码,但我可以理解JavaScript)
答案 0 :(得分:2)
您可以为每个代理随机设置Radius
。然后他们将围绕障碍采取不同的路线。这不会改变这样的事实,即在空白区域中它们都会表现相同。
也许你也可以在目的地引入很少的随机性。但如果有太多随机性,它可能会使代理看起来很愚蠢。
修改强>
对于某些游戏设计,一种好的方法可能是为一组代理进行导航,并且对于其中的每个成员,从小队的中心位置偏移。如果代理人彼此靠近,你也可以动态组建一个小队。
为了查找代理是否彼此如此接近,它们应该动态地形成一个小队,您不必在每个代理的每次更新中循环所有其他代理。
首先,根据游戏的强度,测试距离可以在每10-100次更新左右进行。
其次,您可以使用特殊数据结构来存储对所有代理的引用。例如,如果游戏区域是固定的,则可以将其划分为相同大小的区域。可以存在2D(或3D)矢量阵列,其中存储相应区域中的所有代理。然后,代理只需要测试在同一向量或邻居向量中也引用的其他代理。当然,代理商搬家时需要更新参考文献。
如果小队中已有特工,那么仅仅针对小队进行测试就足够了,而不是针对其中的每一个成员。
答案 1 :(得分:1)
我会创建一个名为"形成"的GameObject。在此编队对象中根据需要制作尽可能多的子对象,以模拟所需的敌人放置位置。将每个子项目放置GameObject放置为紧密编织 - 或者根据您的需要稀疏地填充。稀疏人口(距离地层GameOject中心更远的距离)将导致僵尸通过障碍物采取不同的路径,因为他们的最短距离将随着你移动阵型GO而改变。
对于这种情况下的每个敌人僵尸,让僵尸的NavMeshAgent目标成为其形成GameObject中相应的GameObject位置。在这种情况下将NavMeshAgent放置在阵型上似乎会产生一些不希望的僵尸摇摆。然而,简单地将地层缓慢移向目标游戏似乎会产生合理的5分钟结果。
如果你想为你的队形添加变化,或许添加一个暴民心态,只需添加一个" Bob"每个阵型的脚本类型,将僵尸的目标位置放在地层中稍微偏离中心等等。
通过简单地在小队中切换目标位置(对于其他游戏类型),这也使得在小队中交换敌人角色变得微不足道。