文章目录
前言
A* Pathfinding 官网连接: 点击前往
提示:以下是本篇文章正文内容,下面案例可供参考
一、Pathfinder 面板
1.Grid Graph
最常用的网格渲染,适用大多场景,但对应开放型场景不适合。
2.Navmesh Graph
导航网格。需要 放入 mesh。如果场景不变,这是最合适。
3.Point Graph
不建议使用
二、Pathfinder.Guid 面板
Shape
* 1. Guid 普通网格
* 2. Isometric Guid 等间距网格。这个通常用来做2D
* 3. Hexagonal 六边形网格
* 4. advanced 高级网格
2D
* 这只是一个方便属性,这个属性会读取/修改图形的旋转。与2D平面对齐的旋转决定了图形是否为2D。
Width
* 宽。 网格图通常有10-500个节点宽。但默认情况下,它可以扩展到1024个节点。如果您发现自己需要一个非常高分辨率的网格,请考虑使用重铸图。
Depth
* 深度。网格图通常有10-500个节点宽。但默认情况下,它可以扩展到1024个节点。如果您发现自己需要一个非常高分辨率的网格,请考虑使用重铸图。
NodeSize
* 网格单位。 对于 Grid 类型,这是正方形的长度。对于Hexagonal ,不对应六边形的长度。
Center
* 世界坐标位置。注意的是,寻路渲染,是从下往上的,所以 y轴尽量在 地面一下。
Rotation
* 旋转坐标
Connection
* 以度为单位旋转网格。Eight:8个点。Four:4个点 ,不能斜着走。
Cut corners
* 是否对障碍物优化。 默认开启
Max Climp
* 台阶高度。
Max Slope
* 台阶坡度
Erosion iterations
* 设置障碍物可移动边界。值越大,不可走区域也越大
Collider type
* 碰撞类型
* 1.Sphere:圆形碰撞
* 2.Capsule:胶囊型碰撞
* 3.Ray射线碰撞
Diameter
*直径。障碍物不可走区域。值越大,不可走区域越大。当检查碰撞时,系统将检查是否有任何碰撞器在节点位置重叠特定形状。形状由类型字段决定。如果type设置为Ray,这不会影响任何事情。
Offset
* 距地面高度。例如,如果地面位于y=0, collisionOffset =2 type = Capsule, height = 3,那么物理系统将查询是否有任何碰撞器在一个Capsule中,由底部球体组成的中心为y=2,顶部球体的中心为y=2+3=5。
Obstacle layer mask
* 障碍物layer层级。
Ray length
* 射线长度。 从上到下,多少距离开始计算寻路网格。
Mask
*可以寻路的layer层级
Thick raycast
Unwalkable when no ground
*当没有发现地面时,用高度光线投射使节点无法行走。
三、常用的方法
//Scans all graphs 全局计算网格
AstartPath.active.Scan();
//This holds all graph data 全局网格数据
var data = AstarPath.active.data;
//查找某个图表
var g = data.FindGraph(gra => gra.GetType() == typeof(类型))
//更新网格数据,需要Bounds数据
AstarPath.active.UpdateGraphs(Bounds);
//Seeker 类,相当于Unity 中的Navigation 自动导航脚本
//开启某一段导航,首先要在某个物体上加上该脚本,并获取引用_seeker,
//返回值是个Path,但是由于计算时间问题,并不能保证是最终计算好的路径
_seeker.StartPath(start,end)。
//因此有个计算完成回调. 该回调才是最终的计算好的路径。
//参数为 Path 类型
_seeker.pathCallback += 你的方法
// 获取路径中的所有点。可以利用这些点,进行自动行走。里面还有很多数据,需要的自己查看
path.vectorPath
//还有另一种移动方式。这种方式可以通过按键wasd 进行移动
//给移动物体添加, AIPath脚本,同样的会自动添加Seeker脚本,并获取AIPath引用 aiPath
//参数为 deltaPosition。 意思就是位置差,也可以理解为移动方向
aiPath.Move(deltaPosition * Time.deltaTime * speed)
//但是,这种移动呢,可以在任何区域移动,哪怕是障碍物区域、无渲染网格区域。
//所以,为了解决这个问题,需要设置:
aiPath.constrainInsideGraph = true;
//后续。。。。。。。。。。。。。。。。