最近在游戏开发中要做寻路。首选果断就是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()肯定没用啊。所以,自己加上个判断呗……。
 
     public virtual void Update () {

         if (!canMove) { return; }

         Vector3 dir = CalculateVelocity (GetFeetPosition());
//Rotate towards targetDirection (filled in by CalculateVelocity)
RotateTowards (targetDirection); if (rvoController != null) {
rvoController.Move (dir);
} else
if (navController != null) {
#if FALSE
navController.SimpleMove (GetFeetPosition(),dir);
#endif
} else if (controller != null) {
controller.SimpleMove (dir);
} else if (rigid != null && !rigid.isKinematic) {
rigid.AddForce (dir);
} else {
transform.Translate (dir*Time.deltaTime, Space.World);
}
}
 
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()就好了。
         public void DeserializeGraphsPart (Pathfinding.Serialization.AstarSerializer sr) {
ClearGraphs ();
graphs = sr.DeserializeGraphs ();
if ( graphs != null ) for ( int i = ; i<graphs.Length;i++ ) if ( graphs[i] != null ) graphs[i].graphIndex = (uint)i; userConnections = sr.DeserializeUserConnections();
//sr.DeserializeNodes();
sr.DeserializeExtraInfo();
sr.PostDeserialization(); UpdateShortcuts();
}
 
不论怎样,作为一个第三方的寻路插件,A* Pathfinding Project功能已经很给力了,而且貌似还是一个人搞的(orz...)。所以有点小BUG也无可厚非了,就当锻炼自己Debug的能力了。最后,还是给A* Pathfinding Project点32个赞~~ 

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

  1. [Unity] A* pathfinding project integrated with influence map

    简介 最近一阶段重温了一些关于游戏人工智能方面的书籍. 加强了对influence map的认知.想要亲自动手实现一下. 正如文章标题所示,这篇文章讲的是:如何将influence map的机制融入到 ...

  2. Microsoft Office Project 2016使用心得(一)

    Microsoft Office Project 2016使用心得(一) 新创建一个项目后的准备工作 1.修改项目开始时间 因为项目默认显示的是2009年的信息,所有视图都是从2009年开始,不便于查 ...

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

    Unity4.6 兴许版本号都已经内置了寻路AI了.之前的文章有介绍 Unity3d 寻路功能 介绍及项目演示 然而两年来项目中一直使用的是 A* Pathfinding 这个插件的.所以抽时间来写下 ...

  4. unity3d Pathfinding插件使用

    Overview The central script of the A* Pathfinding Project is the script 'astarpath.cs', it acts as a ...

  5. 如何制作RTS游戏的寻路系统?

    Q1:我们在做一个RTS游戏,开始用的是Unity自带的NavMesh的寻路,但发现这个并不适合RTS多人寻路,因为总会出现阻挡和闪跳的问题.看Asset Store上的A* path插件评论说在碰撞 ...

  6. Unity路径规划

    Unity路径规划  转自:http://www.cnblogs.com/zsb517/p/4090629.html 背景 酷跑游戏中涉及到弯道.不规则道路. 找来一些酷跑游戏的案例来看,很多都是只有 ...

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

    需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一 ...

  8. Unity3D 插件大全

    2D_Toolkit 2d动画开发插件包 FingerGestures 触摸插件 ORK_Okashi_RPG_Kit Unity3D角色扮演游戏开发工具包 uScript-Visual-Script ...

  9. AssetStore资源名字

    NGUI A Pathfinding Project Pro PlayMaker 2DToolkit Scene Manager UniLOD UniLUA Save Game-JSON+Binary ...

随机推荐

  1. 【数位DP】恨7不成妻

    [数位DP]恨7不成妻 时间限制: 1 Sec  内存限制: 128 MB提交: 8  解决: 4[提交] [状态] [命题人:admin] 题目描述 单身!依然单身! 吉哥依然单身!DS级码农吉哥依 ...

  2. 区间dp 整数划分问题

    整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...

  3. 启动Tomcat

    这篇随笔的重点关注启动Tomcat时会用到的两个类,分别是Catalina类 和 Bootstrap类,它们都位于org.apache.catalina.startup包下,Catalina类用于启动 ...

  4. 【题解】codevs 3044 矩形面积合并

    传送门 3044 矩形面积求并 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下 ...

  5. 帝国cms 通过栏目获取某个栏目的详情

    当是某个栏目的时候,获取另外一个栏目下第一篇文章的详情,否则获取当前栏目下第一篇文章的详情 <?php $classid = $GLOBALS['navclassid']; if($classi ...

  6. require.context() 用于获取一个特定上下文的,webpack的一个api

    参考链接: 1.https://www.jianshu.com/p/c894ea00dfec 2.https://www.jianshu.com/p/c894ea00dfec require.cont ...

  7. linux--mysql 8.0.16--裸机安装

    参考: https://www.cnblogs.com/warmsmile/p/10210739.html https://www.cnblogs.com/yg_zhang/p/10424926.ht ...

  8. mysql调优——数据包大小限制max_allowed_packet

     mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ...

  9. 网络基础篇之HDLC、PPP(原理)

    一.广域网传输 之前讲解的都是关于局域网的数据传输,这次讲解的是广域网的传输. 广域网简称WAN,是一种跨越超大的.地域性的计算机网络集合.通常跨省.市.甚至一个国家.广域网包括很多子网,子网可以是局 ...

  10. 微信小程序音乐播放器

    写在前面 1.入门几天小白的作品,希望为您有帮助,有好的意见或简易烦请赐教 2.微信小程序审核音乐类别已经下架,想要发布选题需慎重.附一个参考链接,感谢https://www.hishop.com.c ...