自带寻路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,即可以让寻路物体互相穿过

Unity自带寻路Navmesh的更多相关文章

  1. unity自带寻路Navmesh入门教程(三)

    继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果:   第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路 ...

  2. 【转】unity自带寻路Navmesh入门教程(三)

    http://liweizhaolili.blog.163.com/blog/static/16230744201271225812998/ 继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下 ...

  3. unity自带寻路Navmesh入门教程(一)

    说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图录屏的劳动,如需转载请先告诉我.谢谢! unity自从3.5版本之后,增加 ...

  4. 【转】unity自带寻路Navmesh入门教程(一)

    http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后 ...

  5. unity自带寻路Navmesh入门教程(二)

    上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标:   由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分 ...

  6. 【转】unity自带寻路Navmesh入门教程(二)

    http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/ 上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一 ...

  7. unity自带寻路Navmesh入门教程

    http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ http://liweizhaolili.blog.163 ...

  8. unity3d——自带寻路Navmesh (三)(转)

    继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果:   第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路 ...

  9. unity3D ——自带寻路Navmesh入门教程(一)(转)

    转自:http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自 ...

随机推荐

  1. 联想Y50用U盘改装win7的详细教程

    由于一些原因,部分网友想把自带的win8.1系统改成win7,苦于Y50没有光驱,装系统不方便,下面特意做一个用U盘改装系统的教程,先准备一个8G或更大的U盘,如果里面有重要文件,请先备份,等会要清空 ...

  2. python常用模块——sys模块

    sys模块的功能很多,下面介绍几个常用的模块. 1.sys.argv:从外部向程序内部传递参数 #!/usr/bin/env python import sys print(sys.argv[0]) ...

  3. 设置linux下shell显示不同颜色的字体

    实例代码如下: #!/bin/bash clear echo -e "\033[1m Hello World" # bold effect echo -e "\033[5 ...

  4. KVM虚拟化安装配置

    一.KVM的基础配置及安装: 1.查看是CPU否支持虚拟化: [root@oldboy-node1 ~]# grep -E "(vmx|svm)" /proc/cpuinfo vm ...

  5. $用python玩点有趣的数据分析——一元线性回归分析实例

    Refer:http://python.jobbole.com/81215/ 本文参考了博乐在线的这篇文章,在其基础上加了一些自己的理解.其原文是一篇英文的博客,讲的通俗易懂. 本文通过一个简单的例子 ...

  6. webpack基础配置

    webpack运行规则: Webpack 会给每个模块分配一个唯一的id并通过这个id索引和访问模块.在页面启动时,会先执行入口文件中的代码,其它模块会在运行 require 的时候再执行. 运行时主 ...

  7. arcgis for flex map遮罩

    效果1:map的遮罩(对整个map进行遮罩) 效果2:对某个图层进行遮罩

  8. 纯代码编写qt登录界面(转)

    1. 新建Qt Widgets Application,项目名称为login1,在类信息页面保持类名和基类为MainWindow和QMainWindow不变,取消选择创建界面选项,如下图所示.     ...

  9. mysql case的语法

    测试表:team 第一种语法: CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_ ...

  10. Linux的Cache Memory(缓存内存)机制

    转:https://blog.csdn.net/kaikai_sk/article/details/79177036 PS:为什么Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与W ...