转载

开发者博客:如何用Unity做游戏中寻路导航

  随着手游市场的兴起和对独立开发者的支持,Unity 如今已经成为业内开发者用户最多的引擎,最近,一名海外开发者在博客中分享了自己用 Unity 引擎重做此前研发的 Flash 游戏寻路导航的心得,希望可以给大家带来帮助:

  大家好,最近我一直都在忙于把 2006 年的一款 Flash 游戏用 Unity 引擎重做出来,尽管我们在《Arrival in Hell》这个项目已经工作了一年多,但这里我希望从头开始来写开发者博客,因为这样才能让读者们有比较完整的印象。

  如果你们不太熟悉这款游戏的话,我这里做几句话的介绍,我们在对 2006 年我和朋友 Eduardo Mojica 以及 Richard Rout 三人研发的一款 Flash 游戏进行重做,这是一款点击式操作的冒险游戏,我们将用 Unity 引擎进行重做。我做编程和研发游戏已经有十年左右的经验,但这是我使用 Unity 引擎做的首款游戏。

  在其他事情之前,我首先想要说的就是玩家角色的移动,由于这款游戏现在是真正的 3D,因此玩家角色需要在 3D 空间里寻路。幸运的是,Unity 引擎已经有了一些不错的内置寻路功能,你只要打开窗口-导航(Navigation),选择你想要使用的物体并且放到路径中,然后把他们标记为‘导航静态(Navigation static)’这就会告诉 Unity 这些物体是静态的(非移动),在寻路的时候应该被考虑进去。

开发者博客:如何用Unity做游戏中寻路导航

把物体设置为‘导航静态’

  这里我想要说一说这个功能有多么强大。过去,我和大多数的游戏开发者一样,都必须打造自己的寻路系统,我之前就做过一个A*tile 和基于节点的寻路系统,在两种情况下,特别是基于节点系统的寻路所产生的 walls 让人非常头痛。在基于节点的寻路系统中,你必须手动地把 AI 使用的点在两者之间进行导航。Unity 不仅做导航功能,还使用了导航网格(Navigation meshes),这比手动放置节点更有效率而且更流畅。更重要的是,你还可以一键重新计算整个导航网格,彻底摆脱了手动修改导航节点的做法。

开发者博客:如何用Unity做游戏中寻路导航

我用基于节点系统做的失败的寻路系统之一

  在把静态物体加入了导航网格之后,你可以选择一系列的设定然后点击 bake 按钮,比如在考虑加入一堵墙之前确定坡有多陡以及台阶应该多高。这样你就可以获得可以预览的视图。值得注意的一件事是,不要仅仅因为物体存在在场景中就意味着它是导航网格的一部分。比如说在这款游戏中,我不在乎玩家们是否会踩到瓦砾,所以我并没有把任何瓦砾标识为导航静态,这加快了当行网格的生成速度。

开发者博客:如何用Unity做游戏中寻路导航

《Arrival in Hell》中其实是有数值的

  在导航网格生成之后,我简单地给玩家模型增加了一个 NavMeshAgent 组件,这款游戏现在就可以进行寻路了,唯一剩下的就是增加鼠标输入控制 NavMeshAgent 的目的地。

开发者博客:如何用Unity做游戏中寻路导航

用 NavMesh 做的 bake

开发者博客:如何用Unity做游戏中寻路导航

NavMeshAgent 设定

  为了告诉 NavMeshAgent 导航我做了以下指令:

  1. 注意听取鼠标输入

  2. 把鼠标放进屏幕空间

  3. 把屏幕空间转变成来自摄像头的一束光

  4. 在光达到地面的时候把它移除

  5. 把 NavMeshAgent 的目的地设定到地板的对应位置。

  C#代码是这样的:

开发者博客:如何用Unity做游戏中寻路导航

开发者博客:如何用Unity做游戏中寻路导航
点击设置 NavMeshAgent 的目的地

开发者博客:如何用Unity做游戏中寻路导航

可视化视图下的目的地与路径

  这就解决了我这款游戏的大多数导航需求,唯一的例外就是导航网格由于游戏内的一些活动而发生改变的时候。比如第一个房间的们最开始是关闭的,后来当它打开的时候,当行网格需要更新反映此次变化,允许玩家从新开的们中走过去。我并没有在游戏运行的时候 rebake 完整的静态导航网格,而是使用了 NavMeshObstacle 组件,该组件可以让你把寻路过程中的动态物体加进去,如果物体移动,Unity 的寻路算法就会根据实际情况而更新。

开发者博客:如何用Unity做游戏中寻路导航

导航路径会根据 NavMeshObstacle 的变化而自动发生改变

开发者博客:如何用Unity做游戏中寻路导航

可视化视图

  所以,游戏寻路导航就这么做好了,这就是《Arrival in Hell》游戏中的导航工作原理,这一些只需要 Unity 内自带的导航功能就可以完成了。

正文到此结束
Loading...