Unity自带寻路Navmesh
自带寻路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.为胶囊体添加脚本
- using UnityEngine;
- using System.Collections;
- public class FindObj : MonoBehaviour {
- public Transform targetObj;
- void Start ()
- {
- GetComponent<NavMeshAgent>().destination = targetObj.position;
- }
- }
二、其他功能
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后的结果
- using UnityEngine;
- using System.Collections;
- //该脚本挂在桥上,桥设置为User Layer 0的那个层
- public class ChangeMovable : MonoBehaviour {
- public Transform moveObj;//寻路的物体
- public float timer = 0f;
- void Start ()
- {
- if (moveObj != null)
- {
- moveObj.GetComponent<NavMeshAgent>().walkableMask = 0;
- renderer.enabled = false;
- }
- }
- void Update ()
- {
- timer += Time.deltaTime;
- if (timer > 2f)
- {
- moveObj.GetComponent<NavMeshAgent>().walkableMask = -1;
- renderer.enabled = true;
- }
- }
- }
5.Nav Mesh Obstacle组件(动态路障)
为路障挂上该组件,当该组件enable为true时,不可通过,否则可以通过
该方法与设置可行进层的区别:
使用可行进层时,动态物体会在中断处暂停行进而等待新的路径出现后再继续行进,意味着在暂停的时候,物体的加速度为0;
而使用动态路障时,物体将不会暂停,而是一直在运动并试图绕过障碍来向目标点接近,意味着物体保持着一个加速度。
6.防止一群寻路的物体围住目标点:
设置Nav Mesh Agent组件中的Obstacle Avoidance Type为None,即可以让寻路物体互相穿过
Unity自带寻路Navmesh的更多相关文章
- unity自带寻路Navmesh入门教程(三)
继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果: 第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路 ...
- 【转】unity自带寻路Navmesh入门教程(三)
http://liweizhaolili.blog.163.com/blog/static/16230744201271225812998/ 继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下 ...
- unity自带寻路Navmesh入门教程(一)
说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图录屏的劳动,如需转载请先告诉我.谢谢! unity自从3.5版本之后,增加 ...
- 【转】unity自带寻路Navmesh入门教程(一)
http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后 ...
- unity自带寻路Navmesh入门教程(二)
上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标: 由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分 ...
- 【转】unity自带寻路Navmesh入门教程(二)
http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/ 上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一 ...
- unity自带寻路Navmesh入门教程
http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ http://liweizhaolili.blog.163 ...
- unity3d——自带寻路Navmesh (三)(转)
继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果: 第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路 ...
- unity3D ——自带寻路Navmesh入门教程(一)(转)
转自:http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自 ...
随机推荐
- Http1.0和Http1.1的主要区别
1.HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理 HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器 ...
- Python之正则表达式与常用模块(Day19)
一.正则表达式:匹配字符串的一种规则 正则表达式的在线测试工具: http://tool.chinaz.com/regex/ 字符组: 正则 待匹配字符 匹配结果 说明 [0123456789] 8 ...
- bootstrap-select 使用笔记 设置选中值及手动刷新
直接笔记: 1.页面刚加载完填充select选项数据时,需要手动刷新一下组件,否则没有选项值.(组件初始化时,li 与 option 分离的,需要刷新一下(据说)) $.post('/cpms/tod ...
- 前端基础之jquery_mouse相关操作与不同
jquery中mouse相关操作与不同 mousedown() //当鼠标指针移动到元素上方,并按下鼠标左键时,会发生 mousedown 事件 mouseup() //当鼠标指针移动到元素上方,并松 ...
- 第二篇 Python图片处理模块PIL(pillow)
本篇包含:16.Point 17.Putalpha 18.Putdata 19.Putpalette 20.Putpixel 21.Quantize 22.R ...
- iOS 关于远程推送(push) 的几个问题
1 push 基本流程原理 (1)启动 app (2)注册远程通知 (3)苹果服务器回调一个deviceToken "didRegisterForRemoteNoti ...
- OS X 与传统Unix的一点区别
在传统的Unix系统或者Linux系统中,你是很难在根目录下找到大写开头的文件夹的, 但是看一下OS X: ls / Applications Users etc private var Develo ...
- Hibernate Student_Course_Score设计
示例: 设计代码,实现在数据库中建student表.course表.和score表,展现三者关系 student表:id.name course表:id.name score表:id.score.st ...
- Springboot WebSocket例子
Springboot整合WebSocket 1.application.properties #设置服务端口号 server.port=8080 #thymeleaf配置 #是否启用模板缓存. spr ...
- 【HackerRank】 Sherlock and The Beast
Sherlock and The Beast Sherlock Holmes is getting paranoid about Professor Moriarty, his archenemy. ...