自带寻路Navmesh的三大组件:

1.Nav Mesh Agent:主要挂在寻路物体上

2.Off Mesh Link:实现区域转移功能(例如,有时不一定只是在地面上进行寻路,可能有些高高的平台,平台与地面是不相连的,使用该组件可以跳到平台上)

3.Nav Mesh Obstacle:主要挂在障碍物上

一、基础

1.选中静态对象,勾选Navigation Static

2.Window/Navigation,弹出Navigation视图,点击右下角的Bake按钮生成导航网格

3.在Bake选项卡中调整参数

4.新建一个胶囊体,Component/Navigation/Nav Mesh Agent,添加导航组件

5.为胶囊体添加脚本

  1. using UnityEngine;
  2. using System.Collections;
  3. public class FindObj : MonoBehaviour {
  4. public Transform targetObj;
  5. void Start ()
  6. {
  7. GetComponent<NavMeshAgent>().destination = targetObj.position;
  8. }
  9. }

二、其他功能

1.设置掉落点

a.选中所有静态对象,在Navigation视图的Object标签页下勾选OffMeshLink Generation

b.在Navigation视图的Bake标签页设置Drop Height,点击右下角的Bake按钮

2.跳跃功能

a.添加两个对象,分别为start point和end point

b.对于start point,Component/Navigation/Off Mesh Link,为该组件设置好Start和End

c.Bake后即可看到连接路径,如果看不到可以调整Bake标签页的Step Height

d.新建一个胶囊体,Component/Navigation/Nav Mesh Agent,添加导航组件,添加上面的导航脚本

如果希望上升过程丰富一些,比如播放一个爬梯或者飞行的动作,那么完全可以通过脚本来自行控制。

首先需要放弃勾选行进物体Nav Mesh Agent组件下的Auto Traverse Off Mesh
Link选项,然后编写相应脚本来实现移动过程。在脚本中通过访问NavMeshAgent.isOnOffMeshLink成员来判断是否到达起点或终点,如果到达则访问NavMeshAgent.currentOffMeshLinkData成员来取得起点和终点的信息,最后实现自己的移动过程。完成移动后需要调用NavMeshAgent.CompleteOffMeshLink()来结束手动过渡过程

3.为网格分层

在Navigation视图下的Layers标签页可以设置层,Object标签页可以为物体指定层,Nav Mesh Agent组件的NavMesh Walkable可以指定可行走的层

4.动态更改可行进层

关于walkableMask:

Built-in Layer 0 对应的 walkableMask 为1

Built-in Layer 1 对应的 walkableMask 为2

Built-in Layer 2 对应的 walkableMask 为4

User Layer 0 对应的 walkableMask 为8

User Layer 1 对应的 walkableMask 为16

如此类推,即是walkableMask为2的(n-1)次方

当设置walkableMask 为-1时,表示所有层都能通过

当设置walkableMask 为0时,表示所有层都不能通过

当设置walkableMask 为1时,表示只有Built-in Layer 0层能通过

当设置walkableMask 为2时,表示只有Built-in Layer 1层能通过

当设置walkableMask 为3时,表示只有Built-in Layer 0和Built-in Layer 1层能通过(3 = 1 + 2)

当设置walkableMask 为8时,表示只有User Layer 0层能通过

可以通过查看Nav Mesh Agent组件的NavMesh Walkable看到设置walkableMask后的结果

  1. using UnityEngine;
  2. using System.Collections;
  3. //该脚本挂在桥上,桥设置为User Layer 0的那个层
  4. public class ChangeMovable : MonoBehaviour {
  5. public Transform moveObj;//寻路的物体
  6. public float timer = 0f;
  7. void Start ()
  8. {
  9. if (moveObj != null)
  10. {
  11. moveObj.GetComponent<NavMeshAgent>().walkableMask = 0;
  12. renderer.enabled = false;
  13. }
  14. }
  15. void Update ()
  16. {
  17. timer += Time.deltaTime;
  18. if (timer > 2f)
  19. {
  20. moveObj.GetComponent<NavMeshAgent>().walkableMask = -1;
  21. renderer.enabled = true;
  22. }
  23. }
  24. }

5.Nav Mesh Obstacle组件(动态路障)

为路障挂上该组件,当该组件enable为true时,不可通过,否则可以通过

该方法与设置可行进层的区别:

使用可行进层时,动态物体会在中断处暂停行进而等待新的路径出现后再继续行进,意味着在暂停的时候,物体的加速度为0;

而使用动态路障时,物体将不会暂停,而是一直在运动并试图绕过障碍来向目标点接近,意味着物体保持着一个加速度。

6.防止一群寻路的物体围住目标点:

设置Nav Mesh Agent组件中的Obstacle Avoidance Type为None,即可以让寻路物体互相穿过

最新文章

  1. CentOS7 安装Mono及Jexus
  2. BI解决方案分享:地产BI数据分析系统的建设
  3. REDHAT一总复习1 ssh配置 禁用root用户SSH连接
  4. .net基础复习之一
  5. rem、em、px的区别
  6. Inno调用dll --- 实现背景播放音乐
  7. Faster-rnnlm代码分析3 - EvaluateLM(前向计算ForwardPropagate)
  8. 使用 SharedPreferences 实现数据的存储和读取
  9. CodeForces 445B DZY Loves Chemistry
  10. php之form表单
  11. OpenSuse13.2安装CUDA Toolkit 7.5
  12. Python进阶内容(五)--- type和object的关系
  13. permu(变态考试题)
  14. backbone点滴
  15. BZOJ3738 [Ontak2013]Kapitał 【扩展Lucas】
  16. c#的as,is 运算符
  17. php7-soap调用wsdl接口报错:Could not connect to host
  18. Interrupt handler
  19. EF6.0新特性-DbCommandInterceptor实现非SQL端读写分离
  20. Redis——总结

热门文章

  1. chrome浏览器自动填充失效问题
  2. orange安装文档
  3. Bootstrap主题库
  4. $用python玩点有趣的数据分析——一元线性回归分析实例
  5. Linux虚拟内存管理(glibc)
  6. yield 表达式形式的应用
  7. DNS 安装配置
  8. jquery图片过滤归类应用
  9. crm销售管理系统一
  10. python补充知识点