路漫漫cy 发表于 2013-7-15 20:13

【有图】跪求高手解答‘蘑菇大战’出兵的队形、寻路和躲避障碍物算法,已经卡了一...

目前我的几点想法如下:
1、使用A*寻路,遇到障碍物进行左右分兵,但是分兵是个很麻烦的事情,而且还会出现一队士兵与两个塔相撞的情况,处理起来很麻烦,而且要实现阵型根据通道的宽窄进行收缩;
2、方案1的妥协做法,不进行分兵,直接使用A*寻路,但是问题是寻路是按阵型的中心点来的,不管阵型的宽窄,寻路的路径是一样的,所以按照寻路的路径运动的话,会出现阵型运动到塔边缘时,与塔重合的情况。
当然,这只是几个大的问题,还有很多问题,我也尝试了很多方案,但是都达不到理想的效果,目前已经是黔驴技穷,希望有大神可以给些思路,感激不尽!!

lhy_ps 发表于 2013-7-15 21:30

我没做过rts小队寻径,但我接下来想做这方面的技术探索。目前只能提供些个人想法:
1.目前从图上来看是可以允许小队间彼此碰撞,这样其实主要就是要解决士兵群与寻径路线上障碍物的碰撞问题。
2.考虑A*的启发式公式的时候,除了距离因子,还应该考虑该格子为中心的“半径”范围。也就是包围该格子的邻居是否可以通过的数量。因为除了倾向于更近准则,同时也倾向于更能容纳更多的士兵单位。
3.当目标点周围都足够容纳整个军团,军团倾向于标准A*移动。当不够的时候,根据按照军团一个小队跟着一个小队的方式移动。

路漫漫cy 发表于 2013-7-16 10:08

lhy_ps 发表于 2013-7-15 21:30 static/image/common/back.gif
我没做过rts小队寻径,但我接下来想做这方面的技术探索。目前只能提供些个人想法:
1.目前从图上来看是可以 ...

真的很感谢您的回复!
看完之后我有几点疑问:
1、小队与小队之间彼此碰撞,是为了实现碰到障碍物分兵的问题,但是分兵之后两部分兵环绕障碍物的移动轨迹需要怎么确定,而且要保证每部分兵的相对位置不变,也就是保持队形不变,而且越过障碍物之后,队形会还原;
2、关于第二点,是不是需要修改A* 的算法,以满足需要。而且根据需要,应该是倾向于更近准则的,无法通过时采取动态收缩的方案

其实我现在遇到的瓶颈之一就是动态收缩的问题,如果能解决,肯定能有很大进展!

路漫漫cy 发表于 2013-8-23 11:38

经过一段时间的探索,基本上有些样子了,下面分享一下主要的思路:
首先使用AStarPathFinding插件寻路,方格大小设置为20左右,这个具体看项目需求,尽量不要使用插件里面的Smooth对路径进行平滑处理,原因是做过平滑处理之后路点太多,不利于接下来遇到障碍物分兵的逻辑实现。不过可以自行做平滑处理,方法是使用递归,做两层循环,外层循环从第一个路点开始到最后一个路点,内层循环从最后一个路点开始,在两点之间发射线,没有检测到碰撞体的话,直接把内循环当前路点之前的路点(除了第一个)都给删除掉,意思就是从第一个路点直接走到这个路点,以此类推。
经过上面的步骤之后就得到一个优化了的路点集,做一个循环,从第二个路点开始到最后一个路点,分别向前一个路点发射线,根据检测到的碰撞位置算出分兵之后两队兵分别往左右偏移的距离,这里假定的是碰撞体做成是球形,然后在路点信息里记录下某两个路点之间在多远的地方会有分兵,左右分别偏移多少,左右分别多少兵等这些信息,然后在update里面进行进行判断,如果到达分兵点就开始分兵,当然还要收兵,收兵的信息也可以记录在路点信息里面。
最后就是有些障碍物不用分兵,但可能需要队伍做伸缩处理,这里我使用的方法是从以排为单位,中心点在每排中间,从中间往左右发射线,长度都为每排的长度,然后在FixedUpdate里面检测左右的碰撞,然后算出这排兵是应该往左偏、往右偏、收缩、还是展开,动态改变每个士兵的位置即可,最好要做一下平滑处理。
以上就是主要的思路了,不够详细,但是如果有做过这方面研究的,应该能得到一些启发。
代码由于是公司的项目,没有上面的批准是不能放上来的,还请谅解!

HackerEva 发表于 2017-2-13 10:41

很不错

Mr._chen。 发表于 2017-2-13 10:15

楼主是超人

kj5555 发表于 2017-2-13 10:17

顶顶多好

kj5555 发表于 2017-2-13 10:46

说的非常好

archerxy 发表于 2017-2-13 10:17

很好哦

jingjieyeh 发表于 2017-3-30 22:29

楼主是超人
页: [1]
查看完整版本: 【有图】跪求高手解答‘蘑菇大战’出兵的队形、寻路和躲避障碍物算法,已经卡了一...