logo资料库

Unity3D AStar寻路算法.pdf

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
U 原文地址 http://www.arongranberg.com/unity/a-pathfinding/docs/get-started/ Get Started With The A* Project 下载工程包:http://www.arongranberg.com/unity/a-pathfinding/download/ 在 nity 导 入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 的Ver exCount值,这样的话可以选择raycast 模式,将地形放在不同的层。。。。。。。。。。。。。 最后一种是raycast模式,利用光线投射计算出节点的位置,它比terrain模式有更 多特性,它可以获取碰撞点的法线,因此可以根据StaticMax Angle属性的值,将 坡度太高的点射为不可走。Raycast模式也适用于terrain模式,相比之下terrain模 式只检测节点之间的弧度,而不是真正的法线,就变的不可靠了。 所以在你不能使用平面模式时,建议使用投射模式。 参数 Use Normal ForMax Angle Calculation 计算角度时使用法线 Static Max Angle 可走节点的最大角度 Mask 定义被射线检测的层,这里应该选择玩家、NPC或之类的物体可以站立的 层,而不是障碍层 接下来是Neighbours属性 如果你仔细看场景面板中的网格线,可以发现每个点上连接着四或八条线,有些 游戏中你可能希望你的人物走对角线,有的则不,Neighbours属性可以满足你的 t
要求。 最后一个属性石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.arongranberg.com/unity/a-pathfinding/docs/get-started/part2/ 打开A*的示例工程,新建一个场景 从GameObject菜单新建一个plane,属性(Inspector)面板中设置position为 0,0,0, scale 0,10,10 , 在 创 建 一 个 ?directionlight , 调 整 好 角 度 。 新 建 一 个?emptygameObject,命名为Walls。新建cube,scale设置为 4,4,4,放置在plane 上,然后从层次面板拖拽到Walls中,依次创建一些cube放置在场景的plane上 (duplicate命令或ctrl+d)。 创建完的场景如下: 为 1 接下来,将Walls(及其包含的所有cube,弹出的对话框点yes)的layer属性改为 “Walls”(需先创建)。 再新建一个?emptygameObject,命名为A*,然后添加上AstarPath?脚本,此时就 可以再属性面板看到之前讲到的控件。 首先调整白边框的大小:先将offset设为-50,-1,-50(y设为-1 可以消除float型 数据带来的误差),width和depth设为 11(为什么 11 而不是 10?设为 11 宽度刚
好是 10 个格^_^),最终白边框和plane完全匹配。 如果现在你点击了ScanMap按钮,那么你在场景中将看到一堆不可走的红点,打 开grid的Physics设置,Mask设置为“Walls”,去掉其余的选项,OK,现在可以看 到网格了。 原文地址 http://www.arongranberg.com/unity/a-pathfinding/docs/get-started/part3/ 首先创建一个capsule或cylinder(GameObject–>CreateOther–>Cylinder)作为玩 家,命名为Player,添加上seeker脚本,scale设 2,2,2, Seeker控制多有寻路算法的调用,保存对象所有的相关设置。选中DebugPath选 项,场景中就会显示计算出的路径。 然后添加AIFollow脚本,AIFollow可以让角色移动。 要 角 色 移 动 的 话 你 还 得 先 将capsule 碰 撞 机 换 成 CharacterController(Component–>Physics–>CharacterController)。 接着新建一个sphere ,命名为“target”,scale设置为 4,4,4,这个用来指示当前 路径的目标点 将Clicker脚本添加到Main Camera,这个将监听鼠标点击,告诉角色移动到目标 点。因此camera应该放置在可以看到寻路区域的位置 Clicker脚本中,将Target设置为刚才新建的sphere,Controller设置为玩家 Player,Mask设为everything,其余设置默认。 设置完的界面如下: OK,角色可以到处移动了! Now,Play!
分享到:
收藏