Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 统一导航网使多个敌人走不同的路_Unity3d_Path Finding_Spread_Navmesh - Fatal编程技术网

Unity3d 统一导航网使多个敌人走不同的路

Unity3d 统一导航网使多个敌人走不同的路,unity3d,path-finding,spread,navmesh,Unity3d,Path Finding,Spread,Navmesh,我正在做一个游戏,我有多个敌人都朝着同一个目标移动。我遇到的问题是,所有的敌人都走同一条路去到达这个目标,这导致了不切实际的敌人“聚集”。我的问题是:我怎样才能让它们分散一点,产生拥挤效应?我目前正在使用Unity的内置NavMesh系统。我知道一定有办法惩罚一个敌人用来鼓励其他敌人选择其他道路的道路,但我只是不知道如何实施它。感谢您的帮助!(另外,我最了解c#中的代码,但我能稍微理解JavaScript)您可以为每个代理随机设置不同的半径。然后他们会绕着障碍物走不同的路线。这不会改变这样一个事

我正在做一个游戏,我有多个敌人都朝着同一个目标移动。我遇到的问题是,所有的敌人都走同一条路去到达这个目标,这导致了不切实际的敌人“聚集”。我的问题是:我怎样才能让它们分散一点,产生拥挤效应?我目前正在使用Unity的内置NavMesh系统。我知道一定有办法惩罚一个敌人用来鼓励其他敌人选择其他道路的道路,但我只是不知道如何实施它。感谢您的帮助!(另外,我最了解c#中的代码,但我能稍微理解JavaScript)

您可以为每个代理随机设置不同的
半径。然后他们会绕着障碍物走不同的路线。这不会改变这样一个事实,即在空白空间中,它们的行为都是相同的

也许你也可以给目的地引入一些随机性。但是,如果有太多的随机性,它可以使代理看起来愚蠢

编辑:

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

为了发现代理之间是否如此接近,以至于它们应该动态地形成一个团队,您不需要在每个代理的每次更新中通过所有其他代理进行循环

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

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


如果一个团队中已经有代理,那么只针对团队进行测试就足够了,而不是针对团队中的每个成员。

我会创建一个名为“编队”的游戏对象。在该编队对象中创建所需数量的子对象,以模拟所需的敌人放置位置。根据您的需要,将每个儿童安置游戏对象放置在紧密结合的位置,或放置在人口稀少的位置。稀疏的种群(离阵形游戏对象中心的距离越远)会导致僵尸通过障碍物走不同的路径,因为它们的最短距离会随着阵形的移动而改变

对于本例中的每个敌人僵尸,让僵尸的NavMeshAgent目标成为其相应的游戏对象放置在编队游戏对象中。在这个场景中,在队形上放置一个NavMeshAgent似乎会产生一些不受欢迎的僵尸抖动。然而,简单地将队形慢慢移向目标打法似乎可以产生合理的5分钟效果

如果你想给你的阵型增加变化,也许可以简单地给每个阵型添加一个“Bob”类型的脚本,让僵尸的目标位置稍微偏离阵型的中心,等等


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

谢谢你的想法,如果我的敌人总是避开障碍物(如河流中的岩石),这似乎是可行的,但对于我正在制作的游戏,只有少数障碍物(如建筑物)和许多街道,所以我希望敌人在向角色移动时分散开来。有没有一种有效的方法可以让敌人在不追踪其他敌人的情况下彼此弹跳?职业选手如何解决这个问题?我认为这里没有捷径。如果您想让您的代理相互交互,则需要跟踪所有代理。对于一些游戏设计,一个好的方法可能是为一组代理进行导航,并为其中的每个成员设置位置偏移,使其偏离团队中心。如果特工们彼此靠近,你也可以动态组建一个小组。嗯,这似乎是个好主意!谢谢我希望敌人单独行动(而不是作为一个小队),但基于接近度创建的动态小队可能会奏效!至于跟踪其他敌人的位置,如果我沿着这条路走下去,你知道这对50-60个左右的敌人会有什么影响吗?有没有办法减少敌人可能造成的“cpu占用”?谢谢你的快速回答!我在原来的答案中添加了一些想法。如果你觉得这个答案很有用,你可以在你有足够声誉的时候投票,或者把它标为“正确”答案。如果你有更多的问题,尽管问吧。这是一个僵尸游戏,所以最终会有一个作为暴徒工作的敌人,为此,团队系统将非常有效!但对于我目前的敌人AI,我想我可能最终会实施一个将敌人彼此推开的程序。我可能会创建一个算法,告诉敌人根据离目标的距离将其他敌人推开多远。这样,当距离较远时,敌人将分散开来,但随着距离越来越近,他们将开始向目标集中。感谢您的帮助和快速回答!