Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍

1.Navigation的实现,在平面中,把平面分割成一个一个小格子,使用A*等算法计算从一个小格子到另一个小格子的路径;在3D中,小格子对应的为mesh。

2.创建一个建议的Navigation
①创建要为地形的物体,像是plane与cube
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第1张图片
②把地形设置为navigation static
(1)在windows下的Ai中打开Navigation窗口
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第2张图片
(2)选中物体,把Navigation Static选上
或者是选中物体在Inspector窗口中的static中选择为Navigation Static
③打开Navigation窗口的Bake对烘焙参数进行设置
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第3张图片
Agent Radius:预计在地形上行走物体的半径,如果超过地形,此地形就不允许走
Agent Height:预计在地形上行走物体的高度,如果超过地形,此地形就不允许走
Max Slope:预计在地形上行走物体能够运动的坡度,越小表示爬坡的角度越小
Step Height:预计在地形上行走物体的步高,与Off Mesh Links有关

Off Mesh Links:分离地形能跳跃的Drop Height高度和 Jump Distance距离

Advanced物体在地形上的运动像素的大小,以及转体速度。一般为默认值
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第4张图片
(3)设置完之后,点击Bake
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第5张图片
蓝色区域,表示物体能够运动的区域
并且会生成NavMesh文件(如果是后台,进行导航运算的操作,后台解析此文件获得地形信息,然后将运算结果返回给前端),

(4)地形设置好之后,设置人物
①人物要添加的组件:Nav Mesh Agent
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第6张图片
Agent Type(物体自己使用的)中设置了类似于bake中的值
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第7张图片
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
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第8张图片
Strat:分离网格链接开始点物体
End:分析网格结束点的物体
Cost Override:开销覆盖,开销越大,再有其他路径的情况下,优选考虑其他路径
Bi Directional:是否双向定向

②在Navigation中的Generate OffMeshLink勾选上
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第9张图片
③设置Bake中的允许跨越高度和长度,当两者之间的条件符合时,就会创建一个点,跨越到对方处
在这里插入图片描述

5.分层烘培
(1)自定义Area层
在Areas定义层的名字和Cost消耗

Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第10张图片
(2)设置场景中不同区域烘培为不同的层
选择地形,在Navigation,Object下找到要烘培成的层
在这里插入图片描述
(3)设置角色可以在导航中网格中那些层移动
选择人物,在Nav Mesh Agent中找到AreaMask,设置可以通过的层,也可以通过脚本控制改组件的这一属性

在这里插入图片描述
6.动态遮挡
为创建的移动障碍物,添加Nav Mesh Obstacle组件
Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍_第11张图片
如果勾选了Carve,动态移动的阻挡区域

你可能感兴趣的:(Unity)