Unity Asset Store URL: http://u3d.as/1ud5
随着手机游戏不断发展, 我们需要在手机做更多的表现, 但手机的性能是有限的。每个重要模块都应尽可能地有很好的性能来提升整个表现效果。寻路算法中, 普通的a*在比较大的地图时, 消耗性能也是具大, 因此, 我把a*作了很好的改良。这已作为简单的工具类使用即可, 插件中包括阻挡数据的生成工具, 寻路算法的使用Demo。
本文介绍了高性能”寻路”的基本用法及其应用。
Quick Start
首先, 打开展示场景Demo/DemoSearch1并运行。
你可以看到如下图:
多个对象在随机地自由寻路。也可以自由点击场景, 让主角对象(红点)作寻路运行。
主角寻路时, 会在输出面板, 输出寻路的用时。
从图中可见, 20多个寻路对象, 在不断执行寻路逻辑的情况下, 帧率还是很高的。
DemoSearch1中Inspector面板的说明参数说明:
Scene Prefab是要加载的寻路场景预制体。
Block Data Json是工具生成的寻路数据。
Cell Prefab 是阻挡格用到的预制体。
Move Count 是除主角外的移动对象数量。
Move Speed 是全局的移动速度。
Hero Prefab 是主角用到的预制体。
Player Prefab 是其他移动对象的预制体。
Hero Tail Prefab 是主角移动时, 产生拖尾的预制体。
Player Tail Prefab 是其他移动对象移动时, 产生拖尾的预制体。
S Camera 是主摄像机, 主要用于点击场景的处理。
阻挡数据生成工具说明。
打开Demo/Tools场景
主要关注在Hierarchy中PlaneScene的。
PlaneScene下有LocationGO和Plane
LocationGO主要用于标注绘制阻挡数据的左下角起始点。
Plane是具体展现的场景。
其中在PlaneScene的组件有两个,BoxColider和ABlockTools。
BoxColider的Size必须是需要绘制阻挡数据场景的大小。
ABlockTools的一些配置属性:
Scale Speed: 绘制阻挡数据时, 滚动鼠标中轴对场景进行缩放的速度。
Move Speed: 按着键盘Ctrl+鼠标左键, 移动鼠标时, 场景平移的速度。
Map W和Map H: 是地图的宽高, 必须要跟BoxColider的Size保持一致。
Map Org V2: 就是用于确定阻挡数据的左下角起始点,参考LocationGO的坐标。
Height Of Overlook: 是摄像机开始时, 离场景的高度距离。
Cell W: 是每阻挡格的边长。
Cell Prefab: 是阻挡格的预制体。
Frame Line Prefab: 是边框线条的预制体。
Tools场景运行后, 即可进行阻挡数据的绘制,如果ABlockTools组件挂的GameObject中已在AJ_Pathfinding/Resources/AJ_BlockData中有生成阻挡数据,即会读取其数据,在这基础上进行绘制。
有右键点击PlaneScene中ABlockTools组件, 弹出工具框, 选择”Start drawing blockades” 开始进行阻挡绘制; 此时如果已绘制过阻挡路径并保存的话, 会加载已有的阻挡数据并呈现出来。
在绘制中, 在场景上按着鼠标左键并移动生成阻挡数据; 点击鼠标右键删除阻挡数据;鼠标中轴对场景进行缩放; Ctrl+鼠标左键, 移动鼠标对场景进行平移。
绘制完成后, 右键点击PlaneScene中ABlockTools组件, 选择”Save the blockades data”进行保存。如果不满意,可以选择”Clear the blockades data”来清空当前阻挡数据。
DemoSearch2中的说明:
打开Demo/DemoSearch2场景并运行。跟DemoSearch1类似, 此Demo中加入摄像机跟随, 更好的体现移动中的效果。
另外送上两个人物模型, 包括站立和行走的动作。
API说明:
主要类是:JOMapGrid2DData和AJFindRoad
JOMapGrid2DData是阻挡数据管理类
其中提供网格坐标和世界坐标的转换
AJFindRoad是寻路算法类
其中提供一个寻路api
Eg.
创建两个主体对象
JOMapGrid2DData mapGridData = new JOMapGrid2DData();
AJFindRoad ajSearch = new AJFindRoad();
设置网格的基本信息
mapGridData.SetMapData(float mapW,float mapH,float mapOffsetX,float mapOffsetY,int cellW);
mapW和mapH是地图的宽高。
mapOffsetX和mapOffsetY是开始设置网格的左下角坐标。
cellW是每格的边长。
通过网格下标设置阻挡
mapGridData.SetBlockIdx(int blockIdx, bool isBlock);
通过网格的xy坐标设置阻挡
mapGridData.SetBlock(int cellx, int celly, bool isBlock)
调用寻路算法,返回路径。
List
ajSearch.Search(int beginX, int beginY, int endX, int endY, JOMapGrid2DData mapData);
其中beginX, beginY和endX, endY分别是寻路的开始和结束的网络坐标。
mapData就是以上包括阻挡信息的数据。
函数会返回List
也可以参考
Demo/Scrips/DemoSceneBase中对JOMapGrid2D的设置处理。
Demo/Scrips/MoveGO中对JOMapGrid2D和AJFindRoad 的调用。
Unity Asset Store URL:
https://assetstore.unity.com/packages/slug/142391