@[TOC]导航
七.导航
1.导航的定义
不同于现实中的GPS,unity中的导航主要体现在鼠标点击地面移动和自动寻路如果有多条路,会选择最近的路线进行导航导航物体需要放置在可移动的导航网格上的时候才可以开始导航
2.步骤
设置导航静态物体(Navigation Static),哪些东西是不能动的
方法如下:在 Inspector 面板上 name 后面选择 Navigation Static在 Navigation 面板上的 Object 中也能设置可以设置父物体为导航静态物体,然后选择应用于子物体烘焙地图
但凡是场景发生改变,都需要重新烘焙地图实现导航,添加 NavMeshAgent 组件
脚本控制,脚本导航谁就挂给谁// 使用命名空间 using UnityEngine.AI; // 获取导航组件 private NavMeshAgent _agent; _agent = GetComponent(); // 获取终点 private Transform _target; _target = GameObject.Find(“target”).transform; // 开启导航 if (Input.GetMouseButtonDown(0)) { // 想开启导航只需要设置终点即可 // 设置属性 _agent.destination = _target.position; // 使用方法 _agent.SetDestination(_target.position); }
3.Navigation面板
window -> Navigation面板Agents:可以设一些导航物体模型,给NavMeshAgent中的Agent Type用Areas:分层系统自带三个层,也可以新建层,颜色对应地图上导航网格的颜色Built-in 1:Not WalkableBuilt-in 0:Walkable 默认为这个层Built-in 2:Jump自定义的层…Cost:Unity在计算线路时候附加的权重Bake:烘焙地图Baked Agent Size:根据多大的角色来烘焙地图
导航物体是一个圆柱体Agent Radius:圆柱体半径,不能设置太小,如果设置太小,Unity会提示;如果设为0,会被调为1Agent Height:圆柱体高度Max Slope:最大爬坡的坡度限制,范围[0, 60]Step Height:台阶的高度,角色能迈上去的最高高度,最高和身高一样,超过的话按最高身高算Generated Off Mesh Links:分离路面导航路线连接设置Drop Height:允许向下掉落的最高高度Jump Distance:允许跳跃的最大距离Clear按钮,点击一次清除Scene面板中所有的导航网格Bake按钮,点击一次获得蓝色导航网格,根据地图的复杂程度来决定烘焙时间,只能在导航面板才会看到导航网格,点击一次变成Cancel,不要连点Object:更改指定物体的导航属性
只有带Mesh Renderer的物体或Terrain才能被更改Scene Filter:显示过滤器All:所有物体Mesh Renderers:所有带Mesh Renderer的物体Terrain:所有地形Navigation Static:导航静态物体Generate OffMeshLinks:分离路面导航Navigation Area:分层路面导航所在的层
4.NavMeshAgent组件
Agent Type:此物体的导航物体类型Base Offset:导航圆柱体的物体本身的偏移量Steering:导航速度相关设置Speed:导航移动的最大速度Angular Speed:导航移动的最大角速度Acceleration:加速率Stopping Distance:距离终点还有多远就停下来(例:去找npc,找到后会和npc保持一段距离,到达停止距离的时候开始减速,停的位置会比设置的距离近一些)Auto Braking:自动刹车,当角色到导航终点的时候自动减速Obstacle Avoidance:障碍物的回避设置Radius:回避半径Height:回避高度Quality:回避质量,如果有大量的Agent,将这个值设为0,只处理碰撞,不处理其他的Agent和障碍,节省CPU性能Priority:优先级,范围[0, 99],数字越低优先值越高,物体只会回避数字比自己低的障碍Path Finding:寻路相关设置Auto Traverse Off Mesh Link:自动通过OffMeshLinkAuto Repath:自动重新计算路线Area Mask:物体能走哪些层
5.代码控制
// 设置终点,自动开始导航 // 设置属性 _agent.destination = _target.position; // 使用方法 _agent.SetDestination(_target.position); // 能让导航圆柱体带动物体的位置更新 _agent.updatePosition = false; _agent.updateRotation = false; // 导航剩余距离 _agent.remainingDistance; // 过大的时候显示Infinity // 停止导航 _agent.Stop(); // 弃用 // 恢复导航 _agent.Resume(); // 弃用 // 建议使用 _agent.isStopped = true; // true 为停 false 为导航 // 期望速度(Vector3),Scene面板上的红箭头 _agent.desiredVelosity // 实际速度(Vector3),Scene面板上的蓝箭头 _agent.velosity // 声明 path 储存路径信息 NavMeshPath path = new NavMeshPath(); // 计算能否导航到指定的点,如果能,把路径信息存到path中(返回值为bool) _agent.CalculatePath(vector3 targetPosition, NavMeshPath path); // 获取路径信息,信息包含了所有的拐点 Vector3[] corners = path.corners; // 控制物体可以走哪些层(int) // 0:Nothing // -1:Everything // 1:Walkable 1 << 0 // 2:Not Walkable 1 << 1 // 4: Jump 1 << 2 _agent.areaMask = 1 << 1 | 1 << 2; // 可以走Not Walkable和Jump层
6.动态路障
需要加Nav Mesh Obstacle组件,不用重新烘焙,不会影响导航网格,碰到路障后等待
Shape:形状CapsuleBoxCenter:中心点设置XYZSize:大小设置XYZCarve:碰到路障后是否重新规划路径,如果路都不通,就找一个距离终点最近的地方等待
7.分离路面导航
从一个路面到另一个路面上,两个路面没有联系一般情况下我们把除了地面之外的物体设为分离路面,Navigation面板上设置Off Mesh Link Generation下面的内容跳下去和跳过去的问题通过修改Navigation -> Bake -> Generate Off Mesh Links下面的值就可以,跳上去的问题需要用到Off Mesh Link组件Off Mesh Link组件
点到点跳跃时需要用到次组件Start(Transform):起始点End(Transform):终点Cost Override:计算路径时候的权重Bi Direction:是否为双向通行Activated:是否激活Auto Update Position:是否随着起点终点的改变而改变导航的线路Navigation Area:导航线路所在的层