开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:501

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 275|回复: 11

[其他] 2D游戏中寻路求指导

[复制链接]  [移动端链接]
4四处流浪
389/500
排名
6106
昨日变化
57

3

主题

41

帖子

389

积分

Rank: 4

UID
232247
好友
0
蛮牛币
174
威望
0
注册时间
2017-7-15
在线时间
151 小时
最后登录
2018-2-22
发表于 2018-2-11 16:50:57 | 显示全部楼层 |阅读模式
200蛮牛币
本帖最后由 Trick 于 2018-2-11 21:32 编辑

因为做的东西需要寻路功能,所以这几天一直在看A*的教程。寻路的原理八叉图了解了,但是脚本看的还是半懂不懂,头晕,最后选择了去试试插件。
使用的是A* Pathfinding Project Pro插件。试用了一下后发现,移动物体和障碍物之间会重叠。

然后按官网的视频教程https://arongranberg.com/astar/docs/pathfinding2d.html
设置了一下发现,如果两行障碍之间空格不够大的话,完全就被堵住了。



还试用了一下Unity自带的NavMeshAgent,会在墙角的地方摩擦摩擦。



想实现的功能是如RPG游戏般的只能上下左右行走寻路,求指导。

以下是上面的Test项目文件。
https://pan.baidu.com/s/1c3xLft2

Pathfinding Project Pro.gif
Pathfinding Project Pro2.gif
NavMesh.gif

回复

使用道具 举报

7日久生情
1879/5000
排名
1067
昨日变化
4

0

主题

105

帖子

1879

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
121784
好友
0
蛮牛币
5029
威望
0
注册时间
2015-9-9
在线时间
850 小时
最后登录
2018-2-21
发表于 2018-2-11 16:50:58 | 显示全部楼层
A*算法在寻路的时候是根据每个节点的周围8个方格判断的,如果你只需要上下左右,可以去掉源码中的斜方向

另外,你需要确定你的人物大小,如果你的人物是2*2的,那么路径长宽也必须是2*2,否则无法通过,.
重叠是因为你没有使用网格线作为寻路点,而使用了网格的中点

实际上网格寻路在数据结构中有阐述过,最常用的是使用广度优先搜索求解迷宫
(c++)http://blog.csdn.net/laughing2333/article/details/49619425
(c#)https://www.cnblogs.com/lipan/archive/2010/07/01/1769420.html 这个算法中有CheckP8()函数,你可以修改他为4个方向的判断

评分

参与人数 1鲜花 +2 收起 理由
Vincher + 2 很给力!

查看全部评分

[发帖际遇]: tinkleww 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1284/1500
排名
3785
昨日变化

26

主题

670

帖子

1284

积分

Rank: 6Rank: 6Rank: 6

UID
195974
好友
3
蛮牛币
2947
威望
0
注册时间
2016-12-24
在线时间
360 小时
最后登录
2018-2-22
发表于 2018-2-13 09:31:33 | 显示全部楼层
试试加个刚体然后把他的旋转冻结,感觉效果会好一点

回复

使用道具 举报

4四处流浪
389/500
排名
6106
昨日变化
57

3

主题

41

帖子

389

积分

Rank: 4

UID
232247
好友
0
蛮牛币
174
威望
0
注册时间
2017-7-15
在线时间
151 小时
最后登录
2018-2-22
 楼主| 发表于 2018-2-13 12:02:10 | 显示全部楼层
xiaohunyidao 发表于 2018-2-13 09:31
试试加个刚体然后把他的旋转冻结,感觉效果会好一点

试过,没有什么作用额。
[发帖际遇]: Trick 捡了钱没交公 蛮牛币 降了 2 . 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1284/1500
排名
3785
昨日变化

26

主题

670

帖子

1284

积分

Rank: 6Rank: 6Rank: 6

UID
195974
好友
3
蛮牛币
2947
威望
0
注册时间
2016-12-24
在线时间
360 小时
最后登录
2018-2-22
发表于 2018-2-13 15:39:30 | 显示全部楼层
Trick 发表于 2018-2-13 12:02
试过,没有什么作用额。

你给移动的物体和墙什么的加2D碰撞了吗?还要给移动的物体加上rigidbody2D组件

回复

使用道具 举报

4四处流浪
389/500
排名
6106
昨日变化
57

3

主题

41

帖子

389

积分

Rank: 4

UID
232247
好友
0
蛮牛币
174
威望
0
注册时间
2017-7-15
在线时间
151 小时
最后登录
2018-2-22
 楼主| 发表于 2018-2-13 16:37:05 | 显示全部楼层
本帖最后由 Trick 于 2018-2-13 16:38 编辑
xiaohunyidao 发表于 2018-2-13 15:39
你给移动的物体和墙什么的加2D碰撞了吗?还要给移动的物体加上rigidbody2D组件 ...

加rigidbody2D之后
AI组件对象按照图示继续前进,图像对象困在墙边,再移动target后会发现两个对象的坐标已经不能重合了。
然后将AI组件和图像组件合并到一个对象后是正着进入第一个拐歪处之后卡住不停抖动。

不知道A*寻路有没有限定只可以上下左右直线走的方法,我觉得我的要求A*不好满足,从底层的原理来看就不太对口。

【Tactics RPG之六】策略类RPG寻路算法
昨天看到了这个,感觉应该是我想要的东西,还在研究(感谢译者)。
如果有对A*限定行走方向的方法,请继续告诉我哈。

回复

使用道具 举报

6蛮牛粉丝
1284/1500
排名
3785
昨日变化

26

主题

670

帖子

1284

积分

Rank: 6Rank: 6Rank: 6

UID
195974
好友
3
蛮牛币
2947
威望
0
注册时间
2016-12-24
在线时间
360 小时
最后登录
2018-2-22
发表于 2018-2-13 17:09:25 | 显示全部楼层
Trick 发表于 2018-2-13 16:37
加rigidbody2D之后
AI组件对象按照图示继续前进,图像对象困在墙边,再移动target后会发现两个对象的坐标 ...

所以说,你试试冻结旋转试试啊,这样的话,物体的宽度就和路径的宽度差不多了,应该就不会有卡主的现象
[发帖际遇]: xiaohunyidao 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1284/1500
排名
3785
昨日变化

26

主题

670

帖子

1284

积分

Rank: 6Rank: 6Rank: 6

UID
195974
好友
3
蛮牛币
2947
威望
0
注册时间
2016-12-24
在线时间
360 小时
最后登录
2018-2-22
发表于 2018-2-13 17:13:51 | 显示全部楼层
Trick 发表于 2018-2-13 16:37
加rigidbody2D之后
AI组件对象按照图示继续前进,图像对象困在墙边,再移动target后会发现两个对象的坐标 ...

我感觉你这不是算法导致的问题,而是一些细节导致的

回复

使用道具 举报

4四处流浪
389/500
排名
6106
昨日变化
57

3

主题

41

帖子

389

积分

Rank: 4

UID
232247
好友
0
蛮牛币
174
威望
0
注册时间
2017-7-15
在线时间
151 小时
最后登录
2018-2-22
 楼主| 发表于 2018-2-13 20:41:26 | 显示全部楼层
xiaohunyidao 发表于 2018-2-13 17:13
我感觉你这不是算法导致的问题,而是一些细节导致的

我也怀疑是细节问题导致的,不过冻结我确实是在提问之前就试过了。

有兴趣的话可以试试看能不能找出个确切方案,示例工程就在那,改一下就行了。

回复

使用道具 举报

4四处流浪
389/500
排名
6106
昨日变化
57

3

主题

41

帖子

389

积分

Rank: 4

UID
232247
好友
0
蛮牛币
174
威望
0
注册时间
2017-7-15
在线时间
151 小时
最后登录
2018-2-22
 楼主| 发表于 2018-2-14 11:37:14 | 显示全部楼层
tinkleww 发表于 2018-2-14 11:27
A*算法在寻路的时候是根据每个节点的周围8个方格判断的,如果你只需要上下左右,可以去掉源码中的斜方向

另 ...

好谢谢,我看一下
[发帖际遇]: Trick 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

排名
207
昨日变化

5

主题

613

帖子

3582

积分

Rank: 11Rank: 11Rank: 11Rank: 11Rank: 11

UID
31708
好友
5
蛮牛币
7559
威望
0
注册时间
2014-6-28
在线时间
1080 小时
最后登录
2018-2-21

活力之星

QQ
发表于 4 天前 | 显示全部楼层
感觉你这个算法的分格不太合理啊
我没用过插件,但是我自己写过A*算法的寻路,按照我的理解,A*是按照你设定的二维数组的单个格子的寻路,但你的NPC是4个格子大小,且外接圆的长度是2.828个边长,在贴着障碍物走的时候当然会有穿帮,且当你旋转的时候,转到45°的时候边长会从2变成2.828...这又是造成你旋转穿帮的原因
这就意味着你如果要用A*算法并且保证不穿帮,那么你的NPC的碰撞盒的外接圆的直径就要小于你格子的边长,这样你NPC按照寻路结果格子的中心点走的时候才能保证不穿帮

具体到算法上
1.是按照正确的边长分格,也就是你地图转换到二维数组的时候要保证边长符合外接圆的直径小于寻路格子的边长
2.是不能走斜着的格子,一旦走歇着的格子在走到拐角的时候必然会造成穿帮,所以在判断的周围格子的时候直接放弃掉对角线的4个格子就可以了

评分

参与人数 1鲜花 +5 收起 理由
Trick + 5

查看全部评分


回复

使用道具 举报

4四处流浪
389/500
排名
6106
昨日变化
57

3

主题

41

帖子

389

积分

Rank: 4

UID
232247
好友
0
蛮牛币
174
威望
0
注册时间
2017-7-15
在线时间
151 小时
最后登录
2018-2-22
 楼主| 发表于 4 天前 | 显示全部楼层
hellomercury 发表于 2018-2-18 12:39
感觉你这个算法的分格不太合理啊
我没用过插件,但是我自己写过A*算法的寻路,按照我的理解,A*是按照你设 ...

感谢,之前不知道如何改,后来看了9L网址里的代码,我瞧了瞧,终于知道问题出在哪里了,目前还在解决中,感谢你的帮助

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 返回顶部 返回列表