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);
}
}
}