Unity3D 高效A*寻路

Unity Asset Store URL: http://u3d.as/1ud5

随着手机游戏不断发展, 我们需要在手机做更多的表现, 但手机的性能是有限的。每个重要模块都应尽可能地有很好的性能来提升整个表现效果。寻路算法中, 普通的a*在比较大的地图时, 消耗性能也是具大, 因此, 我把a*作了很好的改良。这已作为简单的工具类使用即可, 插件中包括阻挡数据的生成工具, 寻路算法的使用Demo。

本文介绍了高性能”寻路”的基本用法及其应用。

 

Quick Start

首先, 打开展示场景Demo/DemoSearch1并运行。

你可以看到如下图:

Unity3D 高效A*寻路_第1张图片

多个对象在随机地自由寻路。也可以自由点击场景, 让主角对象(红点)作寻路运行。

主角寻路时, 会在输出面板, 输出寻路的用时。

从图中可见, 20多个寻路对象, 在不断执行寻路逻辑的情况下, 帧率还是很高的。

 

DemoSearch1中Inspector面板的说明参数说明:

Unity3D 高效A*寻路_第2张图片

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的。

Unity3D 高效A*寻路_第3张图片

PlaneScene下有LocationGO和Plane

LocationGO主要用于标注绘制阻挡数据的左下角起始点。

Plane是具体展现的场景。

其中在PlaneScene的组件有两个,BoxColider和ABlockTools。

Unity3D 高效A*寻路_第4张图片

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说明:

主要类是:JOMapGrid2DDataAJFindRoad

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, 如果是null即此路不通, 找到即返回网络路径。

 

也可以参考

Demo/Scrips/DemoSceneBase中对JOMapGrid2D的设置处理。

Demo/Scrips/MoveGO中对JOMapGrid2D和AJFindRoad 的调用。

 

Unity Asset Store URL:

https://assetstore.unity.com/packages/slug/142391

你可能感兴趣的:(Unity3D 高效A*寻路)