找回密码
 立即注册
楼主: 华胜

[AI] AStar寻路算法资料

[复制链接]
发表于 2013-1-3 17:49 | 显示全部楼层 |阅读模式

下载工程包:http://www.arongranberg.com/unity/a-pathfinding/download/

在Unity导入unitypackage,并打开Terrain场景,点击层次(hierarchy)面板的A*gameObject,在属性(inspector)面板就可以看到A*对应的一系列控件,点击Show Gird按钮激活,在场景(scene)面板中就会显示覆盖在地形上的网格

这些网格可以用来导航,每条连线表示节点之间的联通路径,目标可以沿着连线到达一个一个目标点。空缺处(红色方块标记)表示障碍或地形中的斜坡,标记为不可走。最外边的大白边框表示网格的边界,之外的区域没有路径可走。(如果你创建了过于一个网格对象)每个网格对象有不同的颜色,不同颜色间不可寻路,所以多数时候一个世界只需要一个网格对象。

继续说控件。

编辑器中许多控件都有鼠标提示,所以不确定的时候,把鼠标移上去。

控件第一行是个工具栏,包括“Static Setting”,“Runtime Setting”之类的按钮,先看“Static Setting”:

StaticSetting

这些是在运行游戏之前调整的设置,运行时调整可能会出错(数据可能越界)
控件中最重要的是最下边的“Scan Map”,用来更新你以上所作的选择(在场景中调整到Y轴的视角,或游戏(game)面板中调整摄像机的视角能更清楚看到更新),如果你点了“Calculate Grid On Startup”选项,则更新也会被调用。

Grids

还是那句话,你可以用多个网格对象,但多数情况下你只需要一个。
网格所处的位置越高,优先级越高。
例如在一个地方你用了一个节点设置较大的网格,其中有个小房子,你希望路径更精细而用了一个节点设置较小的网格。小房子处的网格有了重复,脚本就会根据两个网格对象优先级,判断房子处应该用哪个(意味着精细的网格应拥有更高的优先级即更高的位置)。

接下来是节点属性设置,留意下其中有些属性只有选择了相应模块后才会显示。

Variables

Show Debug 是不是在场景面板中显示网格
Width X轴的网格数
Depth Y轴的网格数
Node Size 节点大小,与X、Y轴的网格数相乘,得到世界的X、Y轴网格数(Width,Depth)
Height 此处应保证白边框将你要走的多有区域都包含在内。另外,多数时候寻路单元会从轴而不是脚下开始计算高度(意味着偏 高一点),这个属性会使用世界单元的数据,而不是[node size]的,例如Width 、Depth
Offset 网格在世界空间的偏移位置
Physics 检测障碍的所有途经

Walkablecheck 障碍检测的方式,包括
Overlap:球面覆盖检测
Touch:球体接触检测
Capsule:胶囊检测(高度半径单独设置,更符合实际)
Raycast:投射式检测,只检测节点正中心是否可走
Height (上个选项选了胶囊)胶囊高度
Radius 选择了Capsule, Touch 或Overlap模式时,设置半径。
Mask 应该被检测为障碍的层(Layers)
Direction (raycast模式),检测方向
Length (raycast模式),射线长度


网格的设置就这些了。但是如果你使用了地形,而不想使用平面的网格,将要说道的就是适用于地形的设置。这里有三种不同设置定义节点Y轴方向的位置,Flat就是平面网格模式,无需其他设置,Terrain是地形模式,选择之后,节点就会根据地形设置其起始高度。
需要注意的是:如果你使用了一个大地形,就可能会出现“vertexCount > 60000″,脚本无法处理高于60000的VertexCount值,这样的话可以选择raycast模式,将地形放在不同的层。。。。。。。。。。。。。

最后一种是raycast模式,利用光线投射计算出节点的位置,它比terrain模式有更多特性,它可以获取碰撞点的法线,因此可以根据StaticMax Angle属性的值,将坡度太高的点射为不可走。Raycast模式也适用于terrain模式,相比之下terrain模式只检测节点之间的弧度,而不是真正的法线,就变的不可靠了。
所以在你不能使用平面模式时,建议使用投射模式。

参数
Use Normal ForMax Angle Calculation 计算角度时使用法线
Static Max Angle 可走节点的最大角度
Mask 定义被射线检测的层,这里应该选择玩家、NPC或之类的物体可以站立的层,而不是障碍层

接下来是Neighbours属性
如果你仔细看场景面板中的网格线,可以发现每个点上连接着四或八条线,有些游戏中你可能希望你的人物走对角线,有的则不,Neighbours属性可以满足你的要求。

最后一个属性石heapsize,这个是高级属性,理解起来有点费力。
如果你对A*有一定的了解,在A*的脚本中存储了一个包含所有可走节点的开启列表,从当前所在点的下一个可走节点中,选择F值最低的节点,此选中的点的所有可走点再加入开启列表,依次迭代下去,这样脚本在每一帧就要查找200或2000次,但如果从列表中搜索就不需要了,所以脚本用一个二叉堆来加速搜索。
A*算法的详细讲解:
http://www.policyalmanac.org/games/aStarTutorial.htm(英)
http://blog.vckbase.com/panic/archive/2005/03/20/3778.html(中)

Heap size 参数就是用来定义二叉堆的最大长度的,设为1意味着所需的全部节点都可以保存在二叉堆中,相应所需的内存多,设为0.1就是开启列表只能存储十分之一的节点,而所需内存就少了。推荐值为0.5。

详见:http://www.gamengines.com/article-1560.html

发表于 2014-5-27 10:55 | 显示全部楼层
好东西 好东西
发表于 2017-3-11 20:19 | 显示全部楼层
很不错
发表于 2017-3-11 20:15 | 显示全部楼层
顶顶多好
发表于 2017-3-11 20:44 | 显示全部楼层
难得一见的好帖
发表于 2017-3-11 20:46 | 显示全部楼层
很好哦
发表于 2017-3-11 20:38 | 显示全部楼层
不错不错
发表于 2017-3-14 20:06 | 显示全部楼层
好帖就是要顶
发表于 2017-3-14 19:59 | 显示全部楼层
顶顶多好
发表于 2017-3-14 20:23 | 显示全部楼层
真心顶
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-27 15:05 , Processed in 0.091564 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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