• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

01月
07
Unity

Unity导航系统

发表于 2022-01-07 • 字数统计 5791 • 被 1,555 人看爆

简单使用

创建游戏场景

navigation01.png

烘培导航场景

选择全部地面场景(导航可以走的区域)

navigation04.png

勾选Inspector面板的Static(或选择Static下的Naigation Static)

navigation02.png
或者
navigation03.png

打开Navigation界面(Window->Navigation)

navigation05.png

选择Bake->Bake,即可自动烘培,也可自主设置寻路的

navigation06.png
Scene要导航区域出现蓝色区域,即代表烘培成功
navigation07.png

开始寻路导航

寻路对象添加寻路组件

在需要寻路的目标上添加“Nav Mesh Agent”组件,用来在朝目标用户移动时避开障碍物

navigation08.png

添加脚本实现寻路功能

    UnityEngine.AI;     //需要引入
    public Transform TargetObject;      //目标对象

    void Start()
    {
        if (TargetObject != null)
            //获取代理在世界坐标系单位中的目标或尝试设置代理在其中的目标
            GetComponent<NavMeshAgent>().destination = TargetObject.position;
    }

寻路系统部分功能

Agents模块

可以添加多个NabigationAgents可以用不同的Agents,可在"Nav Mesh Agent"组件中Agent Type切换

navigation09.png
navigation10.png

  • 设置烘培Agents的名字
  • 烘培的半径,也就是物体的烘培的半径。这个值影响物体能通过的路径的大小,越小,能行走的路径越大,边缘区域越小
  • 具有代表性的物体的高度,可以通过的最低的空间高度。这个值越小,能通过的最小高度越小。打个比方就是,1m7的人能通过1m7的洞是正常的,你可以设置height为1m,就能通过1m的高度
  • 梯子的高度,这个还是要看模型阶梯的高度来设置
  • 烘培的最大的角度,就是坡度了

Areas模块

可以设置自动寻路烘培的层,配合"Nav Mesh Agent"组件使用,在Area Mask设置

navigation11.png

步骤

1.添加层

navigation12.png

2.设置该层所在区域

选在Scene中所需要该层的对象,在Navigation->Object->Navigation Area选择所需要的层

navigation13.png

3.设置Area Mask

在寻路对象"Nav Mesh Agent"组件上的Area Mask勾选或去除需要的层

navigation14.png

Bake模块

配置烘培参数,就是蓝色区域范围,高度等,这代表寻路时可以走的区域

navigation15.png

  • Radius:具有代表性的物体半径,半径越小生成的网格面积越大。
  • Height:具有代表性的物体的高度。
  • Max Slope:斜坡的坡度。
  • Ste Height:台阶高度。
  • Drop Height:允许最大的下落距离。
  • Jump Distance:允许最大的跳跃距离。
  • Min Region Area:网格面积小于该值则不生成导航网格。
  • Height Mesh:勾选后会保存高度信息,同时会消耗一些性能和存储空间。

Object模块

设置去烘培哪个对象,比如地形之类的,就是可以行走的范围路径.设置时,需要选择具体的对象

navigation16.png

  • Scene Filter:选择场景中那些对象,可以选择全部(All),地形(Terrains),有网格对象(Mesh Renderers)
  • Navigation Static:可以烘培
  • Generate OffMeshLinks:可以跳跃的地方(遇到90度坡,会直接跳下来)
  • Navigation Area:上面有介绍

Off-Mesh Link组件

官网介绍:允许您合并无法使用可行走表面来表示的导航捷径。例如,跳过沟渠或围栏,或在通过门之前打开门,全都可以描述为网格外链接。

添加方法

组件添加

navigation17.png

  • Start:设置起点
  • End:设置终点
  • Cost Override:定义角色通过这个“跳跃线”所要付出的代价是多少。注意:这里的代价覆盖的是“Navigation Area”参数指定的地形代价。-1为不考虑代价。如:想优先选择步行,就可以考虑这个
  • Bi Directional:如果启用此属性,则可以在任一方向上遍历链接。否则,只能按照从 Start 到 End 的方向遍历链接。
  • Activated:用于设置该跳跃线是否激活,是否可用。激活状态:跳跃线为深蓝色;未激活状态:跳跃线为暗红色。
  • Auto Update Positions:如果勾选该参数,则表示自动更新位置,我们在运行状态的时候,是可以动态的改变开始点或者结束点的位置的,同时跳跃线也会动态的更新,反之亦然。
  • Navigation Area:功能和上面Areas模块一样

Navigation界面添加

navigation18.png

注意:该方法添加OffMeshLink,还需要在Bake模块修改"Generated Off Mesh Links"下的值,为0则无效
navigation19.png

NavMeshObstacle组件

如果想要在场景中,动态的放置障碍物,然后也不想在场景开始前就洪培好地形的话,就可以在物体上加上这个组件,然后设置好参数,将自动寻路组件NavMeshAgent的寻路避让优先级调高一点
或者说: 在角色的导航范围内,如果说需要出现障碍物,我们一般是将这些障碍物设置为静态,一起参与 Navigation 的导航烘焙;这样的话,我们的角色在导航的时候,就不会与这些障碍物模型相碰撞。但是如果说我们需要一些“动态的导航障碍物”,这些障碍物模型不设置静态,不参与烘焙,甚至是通过代码实例化出来的模型动态的添加到我们的导航地形中,我们就需要用到一个新的组件了,这个组件就是 Nav Mesh Obstalce。

navigation20.png

  • Shape:控制障碍物的形状,正方体或者胶囊体。注意:这个障碍物可以是一个空物体,我们就是通过这个 Shape 属性来控制这个障碍物的范围。
  • Center:中心点,如果障碍模型的中心点不在模型的中心点上就可以做一些调整
  • Size:设置大小
  • Carve:只有勾选了该属性,这个障碍物才会生效。
    • Move Threshold:大于该值的移动,才认为是真正发生了移动。或者移动某个距离后进行烘焙
    • Time To Stationary:每间隔多长时间,检查一次该障碍物的位置,如果发生了移动则动态的更新导航网格的数据。
    • Carve Only Stationary:勾选后,模型移动时不会实时烘焙。

当前就写到这.....

参考

  • chqj_163-【Unity3D】自动寻路系统Navigation实现人物上楼梯、走斜坡、攀爬、跳跃
  • 苦逼的程序员!!!-unity导航系统
  • Unity官网-导航和寻路
分享到:
Unity导航系统AreaMask代码开启
Unity音效AudioMixer的使用
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 3,776次看爆
  • JAVA_HOME环境配置问题 3,477次看爆
  • AssetBundle使用 3,241次看爆
  • VSCode配置C++开发环境 3,014次看爆
  • Lua反射 2,968次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图