开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1904

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 3538|回复: 62

[慕容小匹夫] 进击的新版NavMesh系统:看我飞檐走壁

  [复制链接]  [移动端链接]
排名
1805
昨日变化
3

43

主题

286

帖子

2937

积分

Rank: 9Rank: 9Rank: 9

UID
44527
好友
55
蛮牛币
2448
威望
0
注册时间
2014-9-12
在线时间
551 小时
最后登录
2017-10-9

专栏作家活力之星认证开发者

发表于 2017-7-26 09:53:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
0x00 前言
unity5.6作为最后的一个版本,的确起到了一个承上启下的作用。除了上一篇文章《进击的AssetBundles和它的工具们》中提到的AssetBundles-Browser,本文还会介绍另一个在Github开源的,用于Unity5.6+的新寻路功能。
0x01 曾经的痛点
Unity5.6之前的navmesh系统的确操作起来十分容易上手,门槛很低。我们只需要将场景内需要烘焙navmesh的区域勾选上Navigation Static选项,之后就可以在Navigation窗口中烘焙整个场景了。
但是曾经的navmesh系统却也存在着一些性能上的和使用场景上的缺陷。
一个常见的问题,由于要预先烘焙场景的navmesh,因此我们很难方便的在运行时动态的修改navmesh。更不用说,有一些游戏的场景并非提前制作好的,需要在运行时动态的生成,这种情况下就无法使用navmesh了。
另一个问题是,如果场景过大的话,烘焙之后的navmesh也会保存很多数据,在运行时会造成一些内存上的开销。
当然,抛开这些不谈,另外一个让我吐槽navmesh的一点就是,它竟然不支持垂直面的导航。
在做一些的platform游戏时,我很希望能利用navmesh来实现寻路的逻辑。(图文无关)
但是,不幸的是,之前的navmesh是不支持的。
0x02 组件化的navmesh
不过还好,虽然新的navmesh系统并没有随着unity的正式版本一同发布。但是,我们还是可以通过github来获取这些新的功能:
NavMeshComponents
需要注意的是,Unity的版本要求在5.6以上。
我们可以看到,其实这里只有4个高层的C#脚本文件:

利用这4个脚本文件,就能基本解决我们之前的烦恼了。
其中NavMeshSurface这个脚本将navmesh组件化,利用这个组件就可以很方便的烘焙挂载该组件的对象的navmesh信息,而无需打开一个navigation窗口对整个场景进行烘焙了。我们甚至可以将挂载这个脚本的GameObject烘焙后保存为一个prefab,这个带有navmesh信息的prefab跟其他的prefab一样。

为对象添加NavMeshSurface组件很简单。在这里我们可以看到和之前navigation窗口类似一些设置,但是请注意,这里已经不是整个场景烘焙了。navmesh已经组件化了,它只会烘焙挂载它的对象。
只要点击一下这个组件下的Bake按钮,挂载它的对象就被烘焙好了。
那么GameObject能否挂载多个NavMeshSurface组件呢?这一种需求也的确存在,例如怪物和玩家的寻路策略不同,有些地方玩家能通过而怪物却不能通过。
这的确也是可以的,同一个GameObject能够同时挂载多个NavMeshSurface组件,并且烘焙不同的navmesh供不同的角色使用。
这样,我们针对不同的角色的NavMeshAgent组件设置不同的agent type并和烘焙好的两个navmesh匹配好就可以了。
0x03 飞檐走壁
好了,借助NavMeshSurface组件我们实现了navmesh的组件化。那么是不是我们就能很方便的实现在垂直面上烘焙navmesh了呢?各位想想我们是否能很轻松的让一个游戏对象的角度改变呢?答案是是的。那么这个游戏对象上如果有navmesh信息的话,我们只需要把这个游戏对象从水平变为垂直是否就行了呢?是的。
因此实现游戏角色的在垂直面上飞檐走壁的功能就变得十分简单了。

当然了,在水平面的navmesh和垂直面的navmesh之间我们还会用到NavMeshLink这个组件来链接二者。各位自己在实践的时候需要留意一下这一点。
0x04 在运行时烘焙navmesh
接下来就让我们看看新的navmesh系统带给我们的新的惊喜——在运行时烘焙navmesh。
这是一个很现实的需求,例如一些动态生成场景的游戏,我们无法在一开始就确定这个场景到底是什么样子的,所以也无法使用之前的navmesh系统,因为以前的navmesh只能在editor内烘焙。但是现在我们使用新的navmesh系统就能够很方便的在运行时烘焙navmesh了。

如图,这是一个空场景,在游戏运行之后场景才生成出来场景内的各种道路,此时单击鼠标,navmesh就生成了。
其实在新的navmesh系统内,实现这个机制十分简单。只需要调用游戏对象上挂的NavMeshSurface组件的BuildNavMesh()方法。
void Start(){    surface = GetComponent<NavMeshSurface>();}void Update(){    if (Input.GetMouseButtonDown(0))    {        surface.BuildNavMesh ();    }}
既然navmesh已经可以在运行时创建了,那么我们能否也在运行时实例化一个navmesh的prefab,实时的影响场景内的寻路策略呢?
答案是当然可以。
0x05 场景太大不用愁
自己做过寻路算法的童靴可能会意识到一个问题,就是在做寻路时如果场景过大的话,寻路的数据可能会比较消耗内存。同样在navmesh中,如果场景过大,或者玩家的视野范围有限,一些对玩家当前位置影响不大的场景的其他位置的navmesh数据就有可能造成一些无谓的消耗。
在新的navmesh系统中,我们同样可以优化这个问题,只烘焙玩家周围的navmesh。

这里同样需要NavMeshSurface组件,在inspector视窗我们可以选择collect object中的volume,之后设定size的值就可以值烘焙这个范围内的navmesh了。之后随着玩家的移动,再动态烘焙新的navmesh就可以了。
ref:
【1】High-level NavMesh Building Components
【2】Unite Europe 2017 - Finding the path: New navigation features
各位如果觉得有趣的话,欢迎点个赞。
-EOF-
最后打个广告,欢迎支持我的书《Unity 3D脚本编程》

https://item.jd.com/12035114.html


评分

参与人数 10鲜花 +31 收起 理由
lin844729085 + 2 赞一个!
香蕉大魔王 + 2 很给力!
懒虫2017 + 2 赞一个!
SAIKI + 4 很给力!
pegasus + 2
kckbkckb2 + 5 很给力!
纳兰幽鬼 + 3 赞一个!
mmuu1987 + 5
angelsky123321 + 1 很给力!
idi0tang + 5 赞一个!

查看全部评分


回复

使用道具 举报

排名
2178
昨日变化
6

28

主题

144

帖子

1540

积分

Rank: 9Rank: 9Rank: 9

UID
178893
好友
13
蛮牛币
2539
威望
0
注册时间
2016-10-28
在线时间
642 小时
最后登录
2017-10-18

专栏作家

发表于 2017-7-26 10:39:54 | 显示全部楼层
这个新功能很实用啊~~大赞

回复 支持 反对

使用道具 举报

7日久生情
3127/5000
排名
87
昨日变化
1

5

主题

107

帖子

3127

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
12951
好友
2
蛮牛币
9246
威望
0
注册时间
2014-1-19
在线时间
861 小时
最后登录
2017-10-17
发表于 2017-7-26 10:56:29 | 显示全部楼层
感谢分享, 受教了

回复

使用道具 举报

排名
2016
昨日变化
4

24

主题

209

帖子

1884

积分

Rank: 9Rank: 9Rank: 9

UID
175038
好友
27
蛮牛币
574
威望
0
注册时间
2016-10-12
在线时间
427 小时
最后登录
2017-10-18

专栏作家活力之星锦衣玉食

发表于 2017-7-26 11:01:23 | 显示全部楼层
thanks for sharing

回复 支持 反对

使用道具 举报

排名
13419
昨日变化
287

0

主题

3

帖子

70

积分

Rank: 2Rank: 2

UID
153036
好友
0
蛮牛币
47
威望
0
注册时间
2016-6-22
在线时间
27 小时
最后登录
2017-10-17
发表于 2017-7-26 11:09:24 | 显示全部楼层
很好,很强大。终于可以不用第三方实现动态寻路了

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1369/1500
排名
1573
昨日变化
7

26

主题

327

帖子

1369

积分

Rank: 6Rank: 6Rank: 6

UID
89788
好友
1
蛮牛币
2667
威望
0
注册时间
2015-4-7
在线时间
360 小时
最后登录
2017-10-18
发表于 2017-7-26 12:14:56 | 显示全部楼层
前几天试了一下,然后突然想起来上学的时候做过一个游戏,也是用导航做的,但是那个效果真的是难看,我是硬生生的把3D场景变成了2D的场景,早点有这个就好了。。。
想起来当时策划看我做的那坨东西的眼神,真的是生无可恋

回复 支持 反对

使用道具 举报

3偶尔光临
268/300
排名
6886
昨日变化
58

0

主题

41

帖子

268

积分

Rank: 3Rank: 3Rank: 3

UID
178227
好友
0
蛮牛币
16
威望
0
注册时间
2016-10-25
在线时间
85 小时
最后登录
2017-10-18
发表于 2017-7-26 13:28:02 | 显示全部楼层
感谢分享,正想要一个这种效果。

回复 支持 反对

使用道具 举报

7日久生情
1847/5000
排名
17300
昨日变化
29

2

主题

1553

帖子

1847

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2483
威望
0
注册时间
2016-11-22
在线时间
268 小时
最后登录
2017-10-18
发表于 2017-7-26 13:48:29 | 显示全部楼层
赞,不错,学习了,谢谢分享
[发帖际遇]: 东坡肘子2010 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

4四处流浪
401/500
排名
7912
昨日变化
191

1

主题

231

帖子

401

积分

Rank: 4

UID
119154
好友
0
蛮牛币
635
威望
0
注册时间
2015-8-21
在线时间
55 小时
最后登录
2017-10-17
发表于 2017-7-26 14:12:24 | 显示全部楼层
谢谢楼主大大。

回复

使用道具 举报

排名
21785
昨日变化
35

0

主题

6

帖子

30

积分

Rank: 1

UID
170719
好友
0
蛮牛币
48
威望
0
注册时间
2016-9-21
在线时间
11 小时
最后登录
2017-8-2
发表于 2017-7-26 14:27:19 | 显示全部楼层
不错不错赞赞

回复

使用道具 举报

3偶尔光临
199/300
排名
8572
昨日变化
12

0

主题

45

帖子

199

积分

Rank: 3Rank: 3Rank: 3

UID
54091
好友
0
蛮牛币
385
威望
0
注册时间
2014-11-8
在线时间
54 小时
最后登录
2017-9-18
发表于 2017-7-26 14:37:33 | 显示全部楼层
赞一个,

回复

使用道具 举报

4四处流浪
439/500
排名
5895
昨日变化
5

1

主题

88

帖子

439

积分

Rank: 4

UID
209909
好友
0
蛮牛币
293
威望
0
注册时间
2017-3-4
在线时间
176 小时
最后登录
2017-10-18
发表于 2017-7-26 15:50:55 | 显示全部楼层
dddddddddddddddddddd

回复 支持 反对

使用道具 举报

7日久生情
1896/5000
排名
711
昨日变化
1

1

主题

243

帖子

1896

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
27816
好友
3
蛮牛币
5861
威望
0
注册时间
2014-6-3
在线时间
596 小时
最后登录
2017-10-18
发表于 2017-7-26 16:04:00 | 显示全部楼层
谢谢分享,

回复

使用道具 举报

排名
259
昨日变化
1

6

主题

193

帖子

2706

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
33291
好友
6
蛮牛币
8060
威望
0
注册时间
2014-7-9
在线时间
947 小时
最后登录
2017-10-18

认证开发者

发表于 2017-7-26 17:41:40 | 显示全部楼层
只有5.6才可以吗?

回复

使用道具 举报

5熟悉之中
675/1000
排名
4087
昨日变化
1

0

主题

195

帖子

675

积分

Rank: 5Rank: 5

UID
168312
好友
0
蛮牛币
1245
威望
0
注册时间
2016-9-13
在线时间
206 小时
最后登录
2017-10-17
发表于 2017-7-26 17:43:31 | 显示全部楼层
路过学习了
[发帖际遇]: 一个袋子砸在了 1169895688 头上,1169895688 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表