【转】AStar寻路算法文档翻译

一周前就翻译出来了,一直没时间发出来,今天有空过来整理下,有些地方不是逐字翻译,加了自己的理解,有问题一起讨论,若有理解不当的地方,期待指正...原文地址 http://www.arongranberg.com/unity/a-pathfinding/docs/get-started/



Get Started With The A* Project
下载工程包: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 节点大小,与XY轴的网格数相乘,得到世界的XY轴网格数(WidthDepth
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″,脚本无法处理高于60000VertexCount值,这样的话可以选择raycast模式,将地形放在不同的层。。。。。。。。。。。。。

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

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

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

最后一个属性石heapsize,这个是高级属性,理解起来有点费力。
如果你对A*有一定的了解,在A*的脚本中存储了一个包含所有可走节点的开启列表,从当前所在点的下一个可走节点中,选择F值最低的节点,此选中的点的所有可走点再加入开启列表,依次迭代下去,这样脚本在每一帧就要查找2002000次,但如果从列表中搜索就不需要了,所以脚本用一个二叉堆来加速搜索。
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
打开A*的示例工程,新建一个场景
GameObject菜单新建一个plane,属性(Inspector)面板中设置position0,0,0scale10,10,10,在创建一个?directionlight,调整好角度。新建一个?emptygameObject,命名为Walls。新建cubescale设置为4,4,4,放置在plane上,然后从层次面板拖拽到Walls中,依次创建一些cube放置在场景的plane上(duplicate命令或ctrl+d)。
创建完的场景如下:
http://www.arongranberg.com/wp-content/uploads/Sk%C3%A4rmavbild-2010-01-29-kl.-15.58.42.png?
接下来,将Walls(及其包含的所有cube,弹出的对话框点yes)的layer属性改为“Walls”(需先创建)。
再新建一个?emptygameObject,命名为A*,然后添加上AstarPath?脚本,此时就可以再属性面板看到之前讲到的控件。

首先调整白边框的大小:先将offset设为-50-1-50y设为-1可以消除float型数据带来的误差),widthdepth设为11(为什么11而不是10?设为11宽度刚好是10个格^_^),最终白边框和plane完全匹配。
如果现在你点击了ScanMap按钮,那么你在场景中将看到一堆不可走的红点,打开gridPhysics设置,Mask设置为“Walls”,去掉其余的选项,OK,现在可以看到网格了。
首先创建一个capsulecylinder(GameObject–>CreateOther–>Cylinder)作为玩家,命名为Player,添加上seeker脚本scale2,2,2
Seeker控制多有寻路算法的调用,保存对象所有的相关设置。选中DebugPath选项,场景中就会显示计算出的路径。
然后添加AIFollow脚本,AIFollow可以让角色移动。
要角色移动的话你还得先将capsule碰撞机换成CharacterController(Component–>Physics–>CharacterController)
接着新建一个sphere ,命名为“target”,scale设置为4,4,4,这个用来指示当前路径的目标点
Clicker脚本添加到Main Camera,这个将监听鼠标点击,告诉角色移动到目标点。因此camera应该放置在可以看到寻路区域的位置
Clicker脚本中,将Target设置为刚才新建的sphereController设置为玩家PlayerMask设为everything,其余设置默认。

OK,角色可以到处移动了!
NowPlay
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值