如何处理RTS游戏中群体寻路后的阵型问题?

问题1:Astarpathfinding插件的RVO例子中圆点移动的目的地被设置成以鼠标点击点为圆心的圆形上,如果设置成同一点,那么到达后就会不停的推…
关注者
8
被浏览
3,862

2 个回答

群体寻路是一种模拟群体行为的技术,它使得游戏中的角色能够以一种有组织的方式移动。在群体中,每个角色都有自己的目标位置,并且会根据周围的情况决定如何移动。群体寻路可以帮助我们实现一些有趣的场景,比如鸟群飞行、鱼群游动等。

对啦!这里有个 游戏开发交流小组 里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

在Unity中实现群体寻路,我们可以使用NavMeshAgent组件。NavMeshAgent是Unity中用于寻路的组件,它可以自动计算角色的移动路径,并控制角色的移动。要使用NavMeshAgent组件,我们需要先创建一个NavMesh,然后将其应用到场景中的地面上。

首先,我们需要创建一个空对象,并将其命名为"NavMesh"。然后,我们需要在场景中创建一个地面,用于角色的移动。在地面上右键点击,选择"Navigation",然后点击"Create NavMesh"。这将为地面生成一个NavMesh,用于寻路。

接下来,我们需要给角色添加NavMeshAgent组件。在场景中选择一个角色,然后点击"Add Component",选择"Navigation",然后点击"NavMeshAgent"。这将在角色上添加一个NavMeshAgent组件。

现在,我们可以通过代码来控制角色的移动。首先,我们需要在代码中获取NavMeshAgent组件的引用。我们可以使用GetComponent方法来获取NavMeshAgent组件的引用,如下所示:

NavMeshAgent agent = GetComponent<NavMeshAgent>();

接下来,我们可以使用SetDestination方法来设置角色的目标位置。例如,我们可以将角色的目标位置设置为鼠标点击的位置,如下所示:

if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;

if (Physics.Raycast(ray, out hit))
    agent.SetDestination(hit.point);
}

}

以上代码将在鼠标左键点击时获取鼠标点击的位置,并将其设置为角色的目标位置。

除了设置目标位置,我们还可以设置角色的移动速度和转向速度。我们可以使用agent.speed属性来设置移动速度,使用agent.angularSpeed属性来设置转向速度。例如,我们可以将移动速度设置为5,转向速度设置为120,如下所示:

agent.speed = 5;
agent.angularSpeed = 120;

现在,我们已经完成了基于群体寻路的解决方案的代码实现。当我们运行游戏时,我们可以看到角色根据鼠标点击的位置智能地移动,避免碰撞和相互干扰。

虽然我不是开发游戏的,但是最近正在学习这方面的内容,提供一个非常简单的思路:

在目标点周围寻找不是障碍物的点,怎么寻找就是阵型的问题了,比如方形寻找,假设第一个正方形长为3(以目标点格子为中心点做方形,格子最小长度为1),如果这个正方形你没有找到满足个数的点,在向外扩张长度1,现在方形长为5,要寻找的范围为长为5的方形中除去长度为3的方形最后的方形(当然你也可以每次重新寻找,这样更简单,但是重复了之前的步骤),直到找到满足单位个数的点为止,这些点就是群体中所有个体的目标点,如果想摆其他阵型,三角阵型啊,矩型啊,十字型啊什么的,只是改变一下寻找点的规则。

希望大神们能提供其他方法,因为自己也感觉上面的方法很糙-。-