day13 Navigation导航系统

一,Unity 导 航 系 统


在Unity当中采用的是基于Navigation Mesh的寻路算法原理,Navigation Mesh是A*算法的变种,将A*算法当中的格子变成三角形或多边形。可以方便 的从二维扩展到三维空间,是3D游戏当中的主流寻路算法.



二,自动寻路


NavMesh NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路 的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网 格,在这些网格的基础上通过一系列的计算来实现自动寻路。 NavMesh寻路一般包含两部分,首先是使用工具根据地图信息生成寻 路用的NavMesh,接下来就是在游戏中根据生成的NavMesh来自动 寻路.


1,首先搭建场景,将需要贡献导航网格的对象设置为导航静态,选中物 体后点击Static,勾选上Navigation Static.


2 , NavMeshAgent


上面我们通过设置游戏物体的NavMesh来设置场景当中有哪些物体可以 贡献导航网格,接下来我们要通过另一个组件NavMeshAgent设置物体 能够在导航网格上寻路。NavMeshAgent可以控制物体在导航网格上面 行走的一个组件。所以该组件添加在能够自动寻路的角色身上.



3,



4,NavMeshAgent常见的属性和方法




*代码:


NavMeshAgent agent; //目标位置
 
public Vector3 destinationPossition; 
 
void Start ()
 
{ 
 
//获取游戏物体身上的NavMeshAgent组件 
 
agent = GetComponent (); 
 
//设置目标点 
 
agent.SetDestination (destinationPossition); }



三,分 离 路 面 导 航




Off Mesh Link参数详解


Start:分离网格链接开始点物体


End:分离网格结束点物体


Cost Override:开销覆盖,开销越大,在有其 他路线情况下会优先考虑其他路径


Bi Directional:起止点是否双向定向


Activated:指定该Off Mesh Link是否参与寻路


Auto Update Positions:启用时,Off Mesh Link会自动重新连接Start与End的坐标


Navigation Area:描述Link所属的NavMesh区域类型



四,分 层 烘 焙 路 面


实现分层路面导航主要分为以下步骤:


(1)自定义Area层


(2)设置场景中不同区域烘焙为不同的层


(3)设置角色可以在导航网格中哪些层移动





其中,可以确定游戏物体可以移动的位置:


1,通过角色自身挂载的NavMeshAgent 组件里的AreaMask属性设置代理可以在导 航网格中的哪些区域移动。默认为 Everything 分层烘焙路面 VR/AR/游戏 角色可行走区域除了通过Nav.


2,



五,动 态 障 碍: Nav Mesh Obstacle




Nav Mesh Obstacle属性详解


Shape:该导航阻挡的形状


Size:导航阻挡在各个轴向上的尺寸


Carve:是否使用Carve模式,使用Carve模式该导航阻挡可以动态移动



核心代码:

public Transform[] targets;
 
NavMeshAgent agent;
 
private int index = 0;
 
float timer = 0;
 
 
 
 
void Start()
 
{
 
agent = GetComponent<NavMeshAgent>();
 
agent.SetDestination(targets[index].position);
 
}
 
 
 
 
void Update()
 
{
 
//判断agent距离目标的位置是否小于等于制动距离
 
if (agent.remainingDistance <= agent.stoppingDistance)
 
{
 
//到达目的,开始计时
 
timer += Time.deltaTime;
 
if (timer >= 0.5f)
 
{
 
//计时器归零
 
timer = 0f;
 
//重新设置Agent的导航目标
 
index++;
 
index %= targets.Length;
 
agent.SetDestination(targets[index].position);
 
}
 
}
 
}