寻路最终版哦

2024-06-19 19:58
文章标签 寻路 最终版

本文主要是介绍寻路最终版哦,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://blog.csdn.net/yxriyin/article/details/40902063

相信大家用Unity3D自带navmeshagent寻路的时候,一定会碰到多人寻路相互挤压的问题。

这个我已经解决了,而且已经应用到我们的项目中,感觉还不错。

首先提下问题的原因:navmeshagent在寻路的时候,并不会把别人当成障碍物,而是在即将和其他agent碰撞的时候,通过减速,碰撞转弯,实现避开其他agent.

但这在游戏中是无法接受的体验。

国外有一个人用了一个办法,大幅的减少了碰撞和挤压的行为,网址:

http://www.gamedev.NET/page/resources/_/technical/game-programming/pathfinding-and-local-avoidance-for-rpgrts-games-using-unity-r3703

他用了代理的方法,非常聪明,而且你看它的例子,几乎感觉到完美。但经过我的测试,实际情况还是会可能出现挤压和卡主的情况。

所以如果你的寻路物体足够多,我建议用这种方式解决,首先效率很高,表现的也足够好。而且对于大量物体寻路,少数卡顿本来也是合理的。


第二种方法我不推荐,但也许是我自己实现不对,那么就是navmesh obstruct, 这个可以挖洞,挖洞之后寻路的时候就会把别人当成障碍物。

但是有三个问题。1,寻路组件和障碍物组件不能同时存在,也就是你要自己处理何时寻路,何时是障碍物。 2. 挖洞并不是实时,而且挖的洞如果刚好形成了一个凹变形,那么狠不幸的,你的寻路要绕老远了。 3.偶尔会卡死,我通过vs attach,发现是Navmesh底层汇编卡死了,原因不明。 当然也许是我没用好,不过我最终放弃了这种方法。


第三种方法,用市面上大部分自称local avoidacne的插件,包括最著名的A* pathfinding project. 这个我只能呵呵了,其实他们的行为和navemeshagent是一样的好么。不信你们可以下载一个试试。

那么问题来了,到底怎么才能实现一套不错的寻路,能让少数人之间完美的避开呢。


我最终解决了,方法如下:

A*寻路的时候把别人当成障碍物。


妈蛋,就一句话? 是的,但别小看这一句话,需要解决的难点非常的多。我主要列几个问题:

1.实时问题,即使你很好的把其他人当成障碍物,并且找到一条路径,可大家都是运动的,总有人会走到你的路径上挡住你,这怎么办。这需要通过AI策略解决。当有人挡住你,你需要停顿住,等待对方离开继续沿路行进。如果等太久,比如超过1s,那么其实就应该重新寻路。

2.性能问题。你很可能需要频繁的寻路,但A*效率比自带的低很多。我建议大家采用simple path的排队策略,能够大幅提高性能。

3.寻路物体大小和网格大小问题,物体有大有小,可能网格太小,但物体很大,怎么寻路的时候判断网格到底是不是真的可以容纳物体?这个其实不难,只要将物体的半径/网格的大小,就可以知道到底几个网格才能够行走。

4.手机上性能吃的消吗?我增加了一个策略,当寻路超过500格,就停止寻路,走向离目标最近点的格子,手机上妥妥的。

还有大量的优化的点,我就不一一例举了。

接下来你肯定要问了,说了这么多,干货呢?

哈哈,代码我已经发布到商店了,但要钱的哦。当然我其实是非常想要开源的,但目前我们游戏开发尚未完成。等做完后,我就公布这部分的代码。

当然你如果一定要慷慨解囊也是可以的。不过声明一下:我的代码通用性并不强,所以你们肯定需要根据自己游戏的实际情况做一些改动。所以我的代码主要还是用来给你们参考最核心的部分,其他细节需要你们自己优化。代码总量应该就3k+,而且大部分A*和simple path一致,不难看懂。

这是商店地址:https://www.assetstore.unity3d.com/en/#!/content/23968

这篇关于寻路最终版哦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075998

相关文章

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

VC环境下字符串转整型最终版

剑指Offer 字符串转化为整型 今天闲来无事,就搜了下这方面的知识,结果发现,这个题就是一个经典的算法题,在剑指Offer里已经详细分析了 直接上代码了,运行可靠,如果大家继续深入理解的话,参考这本书:《剑指Offer——名企面试官精讲典型编程题》 博主:http://blog.csdn.net/cadcisdhht/article/details/36875535 ---------

斯坦福UE4 C++课学习补充25:寻路EQS

文章目录 一、创建EQS二、修改行为树三、查询上下文 一、创建EQS 场景查询系统EQS:可用于收集场景相关的数据。然后该系统可以使用生成器,通过各种用户定义的测试就这些数据提问,返回符合所提问题类型的最佳项目Item。 EQS的一些使用范例包括:找到最近的回复剂或弹药、判断出威胁最大的敌人,或者找到能看到玩家的视线 参考链接:https://dev.epicgames.c

ASP源码 发布站改制最终版 原来3000ok网通大站的源程序

ASP源码 新服发布站改制最终版 原来3000ok网通大站的源程序 这个是非常完整 兼容性很强的。 后台地址:http://你的域名/admin 账号:admin 密码:admin 会员发布地址:http://你的域名/gamevip 源码下载:https://download.csdn.net/download/m0_66047725/89714387 更多资源下载:关注我。

A*算法解决迷宫寻路问题

A*算法解决迷宫寻路问题 问题描述 下图是一个迷宫,试为机器人找一条从Start到End的最短路径设计一搜索算法 设计思路 a)状态空间的表示 首先将迷宫图转换为列表形式呈现,每个格子用 (横坐标,纵坐标,上通路状态,下通路状态,左通路状态,右通路状态)来表示,通路状态用1或0表示,可通过为1,不可通过为0。比如起点(1,1),假定不能从起点出去,所以(1,1)可以走下或走右,所以第一格

【游戏跨场景寻路】基于egret(白鹭)的游戏地图跨场景寻路功能的实现

每次时间久了算法就会淡忘,温故耗时,故做下整理,方便日后取材。 参考网址:         原理性讲解:https://www.toutiao.com/a6540828594954830340/          基于as3的代码:https://blog.csdn.net/sjt223857130/article/details/77199601         堆优化理解:https:

寻路算法 A* 广度优先 深度优先

一般的游戏中都会有寻路算法,在我学程序的这几年里,或多或少有意无意的接触到,虽然我目前的项目中并不需要设计相关的寻路算法,但作为致力于成为独立游戏开发者的我,总是要学习的~~因为,将来的某一天,肯定会用到。   以前就很好奇,一个网游RPG,那些任务引导是怎么让玩家去找到对应的NPC,还有在地图上点一个点,玩家就会自动找到不错的方式去到达目标点,其中如果遇到障碍是跳起来,还是费起来,还是绕过去

Unity中初步使用Navmesh寻路系统

效果demo: 一、新建测试场景 测试场景:新建空Navmesh作为路径的容器 二、设置导航路径 在可以通过的物体上勾选Navigation Static,代表参与到导航的烘焙。 进行烘焙,点击bake按钮,场景出现蓝色的导航网格即代表成功。 三、设置某些不可走的地方 四、添加小人,挂上NavMeshAgent组件 五、利用这个组件控制小人的移动 usin

一篇写的比较简单的A*寻路算法(转)

http://www.raywenderlich.com/zh-hans/21503/a%E6%98%9F%E5%AF%BB%E8%B7%AF%E7%AE%97%E6%B3%95%E4%BB%8B%E7%BB%8D 这篇文章还可以在这里找到 英语 If you're new here, you may want to subscribe to my RSS feed or follow

人工智能: 自动寻路算法实现(三、A*算法)

前言 本篇文章是机器人自动寻路算法实现的第三章。我们要讨论的是一个在一个M×N的格子的房间中,有若干格子里有灰尘,有若干格子里有障碍物,而我们的扫地机器人则是要在不经过障碍物格子的前提下清理掉房间内的灰尘。具体的问题情景请查看人工智能: 自动寻路算法实现(一、广度优先搜索)这篇文章,即我们这个系列的第一篇文章。在前两篇文章里,我们介绍了通过广度优先搜索算法和深度优先算法来实现扫地机器人自动寻路的