前面的文章《Unity教程之-Unity3d自动寻路功能介绍演示》我们学习过unity3d的自动寻路,最近收到有些朋友的反馈,关于unity3d的寻路的介绍还不是太深入,那么下面我们再来看下Unity3d自带寻路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.为胶囊体添加脚本
1
2
3
4
5
6
7
8
9
10
11
|
using
UnityEngine;
using
System.Collections;
public
class
FindObj : MonoBehaviour {
public
Transform targetObj;
void
Start ()
{
GetComponent
}
}
|
二、其他功能
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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
renderer.enabled =
false
;
}
}
void
Update ()
{
timer += Time.deltaTime;
if
(timer > 2f)
{
moveObj.GetComponent
renderer.enabled =
true
;
}
}
}
|
5.Nav Mesh Obstacle组件(动态路障)
为路障挂上该组件,当该组件enable为true时,不可通过,否则可以通过
该方法与设置可行进层的区别:
使用可行进层时,动态物体会在中断处暂停行进而等待新的路径出现后再继续行进,意味着在暂停的时候,物体的加速度为0;
而使用动态路障时,物体将不会暂停,而是一直在运动并试图绕过障碍来向目标点接近,意味着物体保持着一个加速度。
6.防止一群寻路的物体围住目标点:
设置Nav Mesh Agent组件中的Obstacle Avoidance Type为None,即可以让寻路物体互相穿过,好了,本篇unity3d教程到此结束,下篇我们再会!