A* 寻路作为一个插件,最重要的就是如何使用,所以跟着书本上的案例实现了最简单的使用方式—一个起始点和一个目标点之间来寻路。
现在先懂得基础用法
1.插件导入
导入A* Pathfinding 在Component->Pathfinding里面就有相关的组件
2.地图扫描
障碍物在Layer层级面板里面设置Obstacle,地面设置Ground,当然还有许多种层级,现在还不了解
设置完成之后在场景里面添加一个空物体用来挂载A* 寻路组件Astar Path 这个物体只是工具人,除了挂载没有实际意义,场景里面有且只能有一个Astar Path
然后点击Graphs在五种方式里面设置一种来扫描,具体五种有
link可以看这篇文章
这里选择Grid Graph
然后选择作为障碍物的Layer和选择作为高度测试的Layer
高度测试:A*寻路系统会在网格上方Ray Length高度处发出一系列射线,在射线的碰撞点放置可以行走的结点,所以我们要选择地面防止物体走到障碍物上。
Height和Length Diameter用于改变Collier type里面选择的碰撞体的高度和直径。
然后把扫描范围拉到和地图一样大,点击SCAN就可以扫描了。就会生成一个这样的场景
这时候给物体添加Seeker选择好目标点就可以寻找到那条最短路径了。
再添加CharacterController帮助控制物体运动
然后使用自己的代码就可以实现路径移动了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//引入空间Pathfinding
using Pathfinding;
public class AstartAImove : MonoBehaviour
{
//目标位置
public Vector3 targetPosition;
//声明一个Seeker类的对象 获得一个角色控制器
private Seeker seeker;
private CharacterController controller;
//一个Path类的对象,表示路径
public Path path;
//角色每秒的速度
public float speed = 100;
public float turnSpeed = 90;
//可以转向路径下一个航点的距离
public float newWayPointDistance = 3;
//目前前进的点
private int currentPoint = 0;
private void Start()
{
//获得对Seeker组件的引用
seeker = GetComponent<Seeker>();
controller = GetComponent<CharacterController>();
//回调函数,在Astar Path完成寻路以后回调函数
seeker.pathCallback+=OnPathComplete;
//起始位置到目标的寻路开始
seeker.StartPath(transform.position, targetPosition);
}
private void FixedUpdate()
{
if (path == null)
return;
if (currentPoint >= path.vectorPath.Count)
{
Debug.Log("Pathfinding end");
return;
}
Vector3 dir = (path.vectorPath[currentPoint] - transform.position).normalized;
dir *= speed * Time.fixedDeltaTime;
controller.SimpleMove(dir);
//角色转向目标
Quaternion targetRotation = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * turnSpeed);
if (Vector3.Distance(transform.position, path.vectorPath[currentPoint]) < newWayPointDistance)
{
currentPoint++;
return;
}
}
//寻路结束后回调函数
public void OnPathComplete(Path p)
{
Debug.Log("mi zi gei da!"+p.error);
if(!p.error)
{
path = p;
currentPoint = 0;
}
}
private void OnDisable()
{
seeker.pathCallback -= OnPathComplete;
}
}
里面有些知识点 比如Seeker类之中可以使用的方法(暂时没有发现csdn上面有相关文章)
CharacterController可以实现的功能 以及A*Path里面Path类自带的方法
还在继续学习。