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

扫一扫,访问微社区

开发者专栏

关注:1810

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

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

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

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

  [复制链接]  [移动端链接]
排名
1750
昨日变化
1

40

主题

283

帖子

2859

积分

Rank: 9Rank: 9Rank: 9

UID
44527
好友
47
蛮牛币
2404
威望
0
注册时间
2014-9-12
在线时间
543 小时
最后登录
2017-8-15

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

发表于 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


评分

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

查看全部评分


回复

使用道具 举报

排名
2589
昨日变化
15

21

主题

126

帖子

1175

积分

Rank: 9Rank: 9Rank: 9

UID
178893
好友
12
蛮牛币
2273
威望
0
注册时间
2016-10-28
在线时间
514 小时
最后登录
2017-8-17

专栏作家

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

回复 支持 反对

使用道具 举报

7日久生情
3037/5000
排名
80
昨日变化

5

主题

106

帖子

3037

积分

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

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

回复

使用道具 举报

排名
2376
昨日变化
10

22

主题

185

帖子

1663

积分

Rank: 9Rank: 9Rank: 9

UID
175038
好友
25
蛮牛币
4545
威望
0
注册时间
2016-10-12
在线时间
378 小时
最后登录
2017-8-17

专栏作家活力之星

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

回复 支持 反对

使用道具 举报

排名
19644
昨日变化
11

0

主题

3

帖子

34

积分

Rank: 1

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1235/1500
排名
1766
昨日变化
4

24

主题

303

帖子

1235

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

2初来乍到
146/150
排名
9499
昨日变化
5

0

主题

25

帖子

146

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

7日久生情
1680/5000
排名
16553
昨日变化
15

2

主题

1424

帖子

1680

积分

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

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

回复 支持 反对

使用道具 举报

3偶尔光临
288/300
排名
9935
昨日变化
144

1

主题

179

帖子

288

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

排名
20829
昨日变化
20

0

主题

6

帖子

30

积分

Rank: 1

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

回复

使用道具 举报

3偶尔光临
194/300
排名
8369
昨日变化
9

0

主题

45

帖子

194

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

3偶尔光临
292/300
排名
7547
昨日变化
75

1

主题

54

帖子

292

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

7日久生情
1691/5000
排名
821
昨日变化
2

1

主题

223

帖子

1691

积分

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

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

回复

使用道具 举报

排名
271
昨日变化
1

6

主题

186

帖子

2527

积分

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

UID
33291
好友
6
蛮牛币
7543
威望
0
注册时间
2014-7-9
在线时间
867 小时
最后登录
2017-8-17

认证开发者

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

回复

使用道具 举报

5熟悉之中
555/1000
排名
5085
昨日变化
40

0

主题

187

帖子

555

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

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

本版积分规则

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