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/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自 ...
随机推荐
- 在像Angular2这样的SPA应用中使用Google Analytics的方法
Angular2のようなシングルページアプリケーションでGoogleアナリティクスを使う方法 如何在像Angular2这样的SPA应用中使用Google Analytics? 试着调查了一下. 由于S ...
- 函数编程——匿名函数与lambda(一)
python允许用lambda关键字创造匿名函数. 匿名函数是因为不需要以标准的方式来声明,比如说,使用def语句. 但是,作为函数,它们也能有参数. 一个完整的lambda“语句”代表了一个表达式, ...
- javascript;先弹出提示框,再跳转到其他页面。
context.Response.Write("<script>alert('删除成功!" + r.ToString() + "条');window.loca ...
- 如何修改Eclipse中的快捷键
首先打开Eclipse,Windows->Preferences ↓ 进入Preferences界面后,选择General->Keys ↓ 接下来你就会看到: 接下来点击OK就可以生效了.
- Python学习进程(4)运算符
本节主要介绍Python的运算符. (1)Python语言支持的运算符类型: .算术运算符 .比较(关系)运算符 .赋值运算符 .逻辑运算符 .位运算符 .成员运算符 .身份运算符 . ...
- CentOS7在VMWare12中安装后不能上网解决办法
首先要保证你的VMWare Workstation12 在安装号CentOS7后没改动什么关于网络相关的. 1.我的电脑一开始用的是VMWare WorkStations10,发现VMnet8根本不通 ...
- Oracle常用的OCI函数
一. Oracle oci工具包安装: $ORACLE_HOME\BIN:执行文件和help文件 $ORACLE_HOME\OCI\INCLUDE:头文件 $ORACLE_HOME\OCI\LIB\B ...
- 建议13:使用Python模块re实现解析小工具
# -*- coding:utf-8 -*- # ''' Python re 的主要功能: re.compile(pattern[, flags]) 把正则表达式的模式和标识转化成正则表达式对象,供 ...
- 【Head First Servlets and JSP】笔记14:session再探 & Listener示例
对于session的“CRUD” 会话迁移 别忘了HttpSessionBindingListener Listener示例 1.session的“增”与“删”——session的创建和撤销的调用主体 ...
- 前端之CSS样式
一.CSS 1.什么是CSS 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的 ...