自带寻路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. Http1.0和Http1.1的主要区别

    1.HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理 HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器 ...

  2. Python之正则表达式与常用模块(Day19)

    一.正则表达式:匹配字符串的一种规则 正则表达式的在线测试工具: http://tool.chinaz.com/regex/ 字符组: 正则 待匹配字符 匹配结果 说明 [0123456789] 8 ...

  3. bootstrap-select 使用笔记 设置选中值及手动刷新

    直接笔记: 1.页面刚加载完填充select选项数据时,需要手动刷新一下组件,否则没有选项值.(组件初始化时,li 与 option 分离的,需要刷新一下(据说)) $.post('/cpms/tod ...

  4. 前端基础之jquery_mouse相关操作与不同

    jquery中mouse相关操作与不同 mousedown() //当鼠标指针移动到元素上方,并按下鼠标左键时,会发生 mousedown 事件 mouseup() //当鼠标指针移动到元素上方,并松 ...

  5. 第二篇 Python图片处理模块PIL(pillow)

    本篇包含:16.Point    17.Putalpha    18.Putdata    19.Putpalette    20.Putpixel      21.Quantize     22.R ...

  6. iOS 关于远程推送(push) 的几个问题

    1  push 基本流程原理    (1)启动 app      (2)注册远程通知    (3)苹果服务器回调一个deviceToken "didRegisterForRemoteNoti ...

  7. OS X 与传统Unix的一点区别

    在传统的Unix系统或者Linux系统中,你是很难在根目录下找到大写开头的文件夹的, 但是看一下OS X: ls / Applications Users etc private var Develo ...

  8. Hibernate Student_Course_Score设计

    示例: 设计代码,实现在数据库中建student表.course表.和score表,展现三者关系 student表:id.name course表:id.name score表:id.score.st ...

  9. Springboot WebSocket例子

    Springboot整合WebSocket 1.application.properties #设置服务端口号 server.port=8080 #thymeleaf配置 #是否启用模板缓存. spr ...

  10. 【HackerRank】 Sherlock and The Beast

    Sherlock and The Beast Sherlock Holmes is getting paranoid about Professor Moriarty, his archenemy. ...