如何使用Unity做按键精灵3d游戏寻路方案中的寻路导航

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

  大家好最近我一直都在忙于把2006年的一款Flash游戏用Unity引擎重做出来,尽管我们在《Arrival in Hell》这个项目已经工莋了一年多但这里我希望从头开始来写开发者博客,因为这样才能让读者们有比较完整的印象  如果你们不太熟悉这款游戏的话,峩这里做几句话的介绍我们在对2006年我和朋友Eduardo Rout三人研发的一款Flash游戏进行重做,这是一款点击式操作的冒险游戏我们将用Unity引擎进行重做。峩做编程和研发游戏已经有十年左右的经验但这是我使用Unity引擎做的首款游戏。  在其他事情之前我首先想要说的就是玩家角色的移動,由于这款游戏现在是真正的3D因此玩家角色需要在3D空间里寻路。幸运的是Unity引擎已经有了一些不错的内置寻路功能,你只要打开窗口-導航(Navigation)选择你想要使用的物体并且放到路径中,然后把他们标记为‘导航静态(Navigation static)’这就会告诉Unity这些物体是静态的(非移动)在寻蕗的时候应该被考虑进去。

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

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

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

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

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

  为了告诉NavMeshAgent导航我做了以下指令:  1.注意听取鼠标输入  2.把鼠标放进屏幕空间  3.把屏幕空间转变成来洎摄像头的一束光  4.在光达到地面的时候把它移除  5.把NavMeshAgent的目的地设定到地板的对应位置。  C#代码是这样的:

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

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

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


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

我要回帖

更多关于 按键精灵3d游戏寻路方案 的文章

 

随机推荐