01.
02.生成NavMesh导航网格
标记一些静态物体为 Navigation Static
烘焙
03.相关参数设置
Radius:半径。半径数值越小,生成网格面积越大,越容易靠近被烘焙过的静态物 体。
Height:高度。整体网格可以烘焙到的高度。1和2可以理解为寻路者的半径和高度
Max Slope:最大斜坡角度。角度越大,代理越能爬坡 ,超过这个坡度寻路者则无法通过。
Step Height:台阶步高。步高越大,导航代理迈过台阶的能力越强(可达到或代替跳跃效果)。
Drop Height:代理跳落高度。(只能往下跳,不可往上跳)。表示寻路者可以跳落的高度限。
Jump Distance:代理跳跃距离。(往远处跳跃的距离)。 表示寻路者的跳跃距离极限
Advanced高级模式(最好别动.)
Manual Voxel Size 导航烘焙的像素效果
Min Regon Area:网格面枳小于该值的地方,将不生成导肮网格。
Height Mesh:勾选后,将会保存高度信息。
04.导航运动和运动相关设置
Radius:半径。
Height:高度。
Base Offset:偏移值。
在添加了NavMeshAgent组件的对象上直观的影响。
Paste_Image.png
调节以上参数,将会影响外部的Agent线框。
Base Offset指的是Y轴上的偏移。
Steering(操控行为(详情见Game AI篇,AI底层))
Paste_Image.png
Speed:在NavMesh上移动的最大速度
Angular Speed:角速度
Acceleration: 物体从静止到最大速度的加速度
Stopping Distance:停止距离(常与remainingDistance一起使用)
Auto Braking:是否自动减速。(不勾选的话如果速度太快,物体会冲过去目标点以一定的惯性返回目的地)
Obstacle Avoidance(避障)
Paste_Image.png
Obstacle Avoidance
Quality(质量)(枚举)
None : 无
Low Quality:低质量
Medium Quality:中等质量
Good Quality: 高质量
High Quality: 高质量
Priority: 优先值,低优先值的会给高优先值的让路。
Path Finding(路径跟随)
Path Finding
Auto Traverse Off Mesh Linked:
是否自动分离网格。(勾选时到达分离点时会从该分离点移动到另外一个分离点。)(一般不勾选,因为要配套爬墙或者跳跃的动画)
Auto Repath
是否自动重新规划路线。
Area Mask
网格遮罩。(枚举,规定物体可以通过的区域)
NavMeshAgent API 官方API
NavMeshAgent API:
Paste_Image.png
在检视面板中看到的Agent参数都可以用过脚本获取并控制。
一些常用的参数。
destination属性:可以设置目标点(SetDestination(target)方法相同效果)
nextPosition:获取或设置模拟navmesh代理的位置,可以手动的驱动角色进去移动(配合动画使用)
remainingDistance:物体当前位置与目标点的剩余距离。(设置了StopDistance后会出现一个问题,到时可以用这两个参数去调节)
UpdatePosition,UpdateRotation两个值都为bool值,可以通过更改他们俩,停止使用Agent组件来驱动物体移动和旋转。
isOnNavMesh: 判断物体是否在导航网格上。
isOnOffMeshLink: 判断物体是否在分离网格链接上。
常用方法。
SetDestination(Vector3 position): 设置目标点。
Stop(): 停止寻路。
ResetPath():清空当前路径。
Resume(): 停止游戏角色进行移动,并重新开始移动(原路径)。
Wrap(Vector3 position):将物体瞬移到目标点。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Player : MonoBehaviour
{
private NavMeshAgent navMeshAgent;
public Transform target;
void Start()
{
navMeshAgent = this.GetComponent<NavMeshAgent>();
navMeshAgent.SetDestination(target.position); //设置目标点
}
}
05.设置子物体是障碍物 不烘焙
06.设置花费
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Player : MonoBehaviour
{
private NavMeshAgent navMeshAgent;
public Transform target;
void Start()
{
navMeshAgent = this.GetComponent<NavMeshAgent>();
navMeshAgent.SetDestination(target.position); //设置目标点
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//使用主摄像机创建一根射线,射线的方向是鼠标点击的位置。
Ray ray =Camera.main.ScreenPointToRay(Input.mousePosition);
//使用物理类检查射线的碰撞,如果点击物体存在
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
navMeshAgent.SetDestination(hit.point);
}
}
}
}