1.Navigation的实现,在平面中,把平面分割成一个一个小格子,使用A*等算法计算从一个小格子到另一个小格子的路径;在3D中,小格子对应的为mesh。
2.创建一个建议的Navigation
①创建要为地形的物体,像是plane与cube
②把地形设置为navigation static
(1)在windows下的Ai中打开Navigation窗口
(2)选中物体,把Navigation Static选上
或者是选中物体在Inspector窗口中的static中选择为Navigation Static
③打开Navigation窗口的Bake对烘焙参数进行设置
Agent Radius:预计在地形上行走物体的半径,如果超过地形,此地形就不允许走
Agent Height:预计在地形上行走物体的高度,如果超过地形,此地形就不允许走
Max Slope:预计在地形上行走物体能够运动的坡度,越小表示爬坡的角度越小
Step Height:预计在地形上行走物体的步高,与Off Mesh Links有关
Off Mesh Links:分离地形能跳跃的Drop Height高度和 Jump Distance距离
Advanced物体在地形上的运动像素的大小,以及转体速度。一般为默认值
(3)设置完之后,点击Bake
蓝色区域,表示物体能够运动的区域
并且会生成NavMesh文件(如果是后台,进行导航运算的操作,后台解析此文件获得地形信息,然后将运算结果返回给前端),
(4)地形设置好之后,设置人物
①人物要添加的组件:Nav Mesh Agent
Agent Type(物体自己使用的)中设置了类似于bake中的值
Speed:导航的速度
Angular Speed:转体速度
Acceleration:加速度
Stopping Distance:距离目标的停止距离
Auto Braking:自动刹车
②设置Script进行控制,获取一个NavMeshAgent控件
NavMeshAgent my_NavMeshAgent;
void Start()
{
my_NavMeshAgent = GetComponent<NavMeshAgent>();
}
③调用SetDestination方法设置目标点,方法的参数为Vec3
可以设置一个transform节点,放在一个位置,然后把transform.position传给SetDestination方法
//设置transform
[SerializeField]
Transform m_aim;
my_NavMeshAgent.SetDestination(m_aim.position);
3.NavMeshAgent常见的属性和方法
①属性:
autoTraverseOffMeshLink:bool 类型 到达跳跃点是否执行跳跃
currentOffMeshLinkData:OffMeshLinkData类型,当前连接的数据
desiredVelocity:vector3类型,期望速度
destination:vector3类型,目标position
②方法:
SetDestination(Vector3 target):设置目标点
ResetPath():清除当前路径
Stop():停止代理运动
ActivateCurrentOffMeshLink(bool flag):启动或者禁止当前的offMeshLink
4.跨越地形Off Mesh Link组件
①在地形上加Off Mesh Link
Strat:分离网格链接开始点物体
End:分析网格结束点的物体
Cost Override:开销覆盖,开销越大,再有其他路径的情况下,优选考虑其他路径
Bi Directional:是否双向定向
②在Navigation中的Generate OffMeshLink勾选上
③设置Bake中的允许跨越高度和长度,当两者之间的条件符合时,就会创建一个点,跨越到对方处
5.分层烘培
(1)自定义Area层
在Areas定义层的名字和Cost消耗
(2)设置场景中不同区域烘培为不同的层
选择地形,在Navigation,Object下找到要烘培成的层
(3)设置角色可以在导航中网格中那些层移动
选择人物,在Nav Mesh Agent中找到AreaMask,设置可以通过的层,也可以通过脚本控制改组件的这一属性