使用A* Pathfinding Project的一些心得

最近在游戏开发中要做寻路。首选果断就是Unity3D自带的寻路啦。方便稳定,基本功能都能满足。我们的需求也不复杂,就是一个英雄在不同的地图中探索。但是介于一个比较恶心的问题,果断放弃了它。所以,说A* Pathfinding Project之前,让我先吐槽几百字……

这个问题就是NavMesh不能动态地加载。Unity3D中每一个场景的NavMesh,如果有的话,都会对应一个名叫NavMesh.asset的文件。一一对应。假如你使用Resources.Load()方法载入它,会发现它其实就是一个NavMesh类的实例。好方便啊~~。但是Unity3D却没有提供任何方法动态替换一个场景的NavMesh。NavMesh类都是静态方法哦~。你就是载入进来,也拿它没辙,哦吼吼~。那好吧,接受这个残酷的现实。但哥不嫌麻烦,咱每一张地图都建一个场景,对应一个NavMesh,可以了吧?理论上可以。但实际不行。介于场景众多,你在操作它们的时候(移动、重命名等等),你不知什么时候,场景和它的NavMesh的关联关系就会丢失。总之,再次给Unity3D的做了一半的功能跪了。

通过百度、谷歌,以及各种机缘巧合,知道了有A* Pathfinding Project这个寻路插件。看它高大上的官网(http://arongranberg.com/astar/),介绍的各种功能也是很强大的。A*,NavMesh和好多其它种哥也不懂的寻路算法都实现。 而且可以Save和Load预先做好的NavMesh和设置。于是哥决定尝试一下……

具体的使用,这里就不详细说了。看它自带的ExampleScenes以及官方教程(http://arongranberg.com/astar/docs/index.php)就可以了。下面说一些遇到的坑,希望对遇到的朋友有帮助。

1.如果你想要使用代码来Scan,AstarPath.active.Scan()或者ScanLoop()是不靠谱的。它们只有在AstarPath这个组件被选中时才管用。建议使用AstarPathEditor.MenuScan()。这个是位于Edit菜单内的功能选项。是可以在编辑器内调用的。

2.建议使用RecastGraph替代NavMeshGraph。两者寻路效果上没有太大差别,只是NavMesh的生成方式不一样。NavMeshGraph需要你手动指定一个Mesh。而RecastGraph是根据图层,和摆在场景里的Mesh生成的NavMesh。甚至可以在运行时生成。相比指定一个Mesh要灵活多了。而且NavMeshGraph的UI代码有问题,不能拖拽,必须从整个工程里面选。。。

3.AIPath这个很常用的脚本是有BUG的。虽然作者自己也说了吧。但没想到问题那么明显。作者为了达到最大程度地兼容,让AIPath在GameObject上,依次去找CharacterController,Rigidbody,最后是Transform,来控制移动。如果使用Rigidbody的话,会使用AddForce()方法移动。但是,却没有判断isKinematic这个属性。如果为true,AddForce()肯定没用啊。所以,自己加上个判断呗……。

4.目前(3.5.1版本)A* Pathfinding Project还不支持躲避(Local Avoidance)。在之前版本,躲避是使用RVO这个插件实现的。但貌似由于版权问题,RVO被从A* Pathfinding Project中剥离了。如果非要实现躲避或动态阻挡这类功能,可以使用NavmeshCut这个组件。它只支持RecastGraph。原理就是实时地更新NavMesh,从中挖一个洞。要实现这个效果,场景中还必须挂一个TileHandlerHelper的组件。它会定时更新NavMesh。不过,如果阻挡物过多,或者更新频率过于频繁,肯定是不靠谱的。毕竟要修改Mesh也是有一定开销的。那建议就选用别的寻路插件咯……。

5.另外,TileHandlerHelper会提前对graph进行判空检查。假如,你的RecastGraph是运行时加载的,那这里肯定会报空指针。这是因为在AstarData类的DeserializeGraphsPart()方法里,对数据反序列化后,没有更新AstarData.recastGraph这个字段。在DeserializeGraphsPart()最后手动调用一下UpdateShorcuts()就好了。

不论怎样,作为一个第三方的寻路插件,A* Pathfinding Project功能已经很给力了,而且貌似还是一个人搞的(orz...)。所以有点小BUG也无可厚非了,就当锻炼自己Debug的能力了。最后,还是给A* Pathfinding Project点32个赞~~

时间: 2024-10-20 12:20:11

使用A* Pathfinding Project的一些心得的相关文章

Get Started with the A* Pathfinding Project

本系列教程为A*寻路插件的官方教程翻译,本来我想找现成的文档貌似没有无奈之下只好自行翻译顺便造福群众. A*插件大概的功能就是A到B点之间最佳的路径,读完本篇教程你能学到在项目中配置A*并且写一个简单的能规避障碍物的AI. Pathfinding is all about finding the best path between point A and B. This is what the A* Pathfinding Project does, in this tutorial you w

[Unity3D插件系列]-A* Pathfinding Project 学习(一)

一直想在Demo中使用Unity3D自带的寻路模块,但是遇到一些问题: 需求中要求游戏中的对象可以寻路的同时,成为其他对象的障碍,我就在同一个对象上添加了NavMeshAgent和NavMeshObstacle,但是出现了对象乱动的异常情况,查了官方文档还有论坛,没有对这种同时添加并起作用的情况有明确的解决方案:这时只能求助于其他寻路插件了,A* Pathfinding Project看起来还不错,考虑学习下. 1. 场景准备 先建立一个scene 添加一个plane,让其坐标处于(0,0,0)

Microsoft Office Project 2016使用心得(一)

Microsoft Office Project 2016使用心得(一) 新创建一个项目后的准备工作 1.修改项目开始时间 因为项目默认显示的是2009年的信息,所有视图都是从2009年开始,不便于查看,所以这里我们先修改一下项目的开始时间 a.切换至项目选项卡 b.点击项目信息按钮,弹出项目信息编辑框 c.在开始时间一栏输入项目的实际开始时间,我们会发现甘特图中显示的时间区域变为了我们设置的时间 2.修改项目默认日程信息 不同公司的上下班时间以及工作时长都可能会不同,这里我们要设置一下项目日程

A* Pathfinding Project (Unity A*寻路插件) 使用教程

Unity4.6 后续版本都已经内置了寻路AI了,之前的文章有介绍 Unity3d 寻路功能 介绍及项目演示 然而两年来项目中一直使用的是 A* Pathfinding 这个插件的,所以抽时间来写下这个插件的简单使用. 根据游戏的类型,使用到的插件功能可能会不一样,我这里只介绍最简单的,也是使用的最多的简单寻路.复杂的如跟随.动态,都有对应的例子来学习. 我也一直都没有去看-- 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 下

Unity路径规划

Unity路径规划 背景 酷跑游戏中涉及到弯道.不规则道路. 找来一些酷跑游戏的案例来看,很多都是只有直线道路,也就不存在所谓的路径问题,设置一个方向即可,本文主要给出几种我自己用过.看过的Unity中可以用做路径规划的一些资料. 方案一 Unity自带解决方案Navigation,可以参考小赵的文章: unity自带寻路Navmesh入门教程(一) unity自带寻路Navmesh入门教程(二) unity自带寻路Navmesh入门教程(三) 这几篇文章还是不错的,配合官方文档,对其功能就能就

Unity3D 2D游戏中寻径算法的一些解决思路

需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一些例如机器人.npc等,都需要自动寻路的功能. 我需要实现的功能类似于当年FC游戏中淘金者的运动方式.游戏中有淘金者.敌人,可移动,不可移动区域,只能沿着直线的向前向后或者向上向下. 思路 unity3d中也有一些2d寻路的插件.例如A Pathfinding Project Pro和NavMesh

从 NavMesh 网格寻路回归到 Grid 网格寻路。

上一个项目的寻路方案是客户端和服务器都采用了 NavMesh 作为解决方案,当时的那几篇文章(一,二,三)是很多网友留言和后台发消息询问最多的,看来这个方案有着广泛的需求.但因为是商业项目,我无法贴出代码,只能说明下我的大致思路,况且也有些悬而未决的不完美的地方,比如客户端和服务器数据准确度和精度的问题,但是考虑到项目类型和性价比,我们忽略了这个点. 从今年5月份开始为期一个月,我的主要工作是为新项目寻找一个新的寻路方案.新项目是一个 RTS 实时竞技游戏,寻路要求是:每个寻路单位之间的碰撞精确

2Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载

转载自风宇冲Unity3D教程学院 http://blog.sina.com.cn/s/blog_471132920101crh3.html 引言:想用Unity3D制作优秀的游戏,插件是必不可少的.工欲善其事必先利其器.本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具.为此我写了插件的经验及理论讲解,涉及插件的 学习/辨别/选择/配合.也写了插件的 评测/教程/下载.关于评测,带有一定的主观性,仅供参考.关于教程,热门插件网上已经有很多教程了,本文提供链接,网上资料少的插

Unity3D面试问题

注意,是问题,不是笔试题哦.这些是我最近面试北京各公司总结的一些被问到的还算典型的问题.跟大家分享一下.答案是我自己的,不保证标准和完整. 哎,公司年底开人,又校招一群便宜的小鬼……桑死心了……好在找到工作了. 言归正传: NGUI在不同屏幕分辨率下如何适配? NGUI本身是按照高度进行适配.NGUI按照目标设备的高度(targetHeight)与设置好的高度(manualHeight)的比值来进行适配.如果宽高比是一样的,则总可以完美适配.但如果不一致,则可能会出现左右两边有黑边(比设备宽高比