寻路状态
在怪物结点上添加一个子节点作为怪物的可视范围
逻辑
当玩家进入了怪物的可视范围,怪物就会从巡逻状态改为追踪状态,使用A*算法完成怪物对玩家的位置的最短路径的搜索,然后使怪物移动到玩家之前的位置。
public class VisibleRange : MonoBehaviour
{
public void OnTriggerStay2D(Collider2D collision)
{
if (collision.gameObject.tag == "Player")
{
//this.gameObject.transform.parent.GetComponent<Monster>().canSeePlayer = true;
transform.parent.GetComponent<Monster>().canSeePlayer = true;
transform.parent.GetComponent<Monster>().lastSeenPlayer = collision.transform.position;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
transform.parent.GetComponent<Monster>().canSeePlayer = false;
}
}
调用A*算法计算完最短路径,然后转换为路点状态,让怪物行动到玩家之前的位置
if ((Vector2)e.transform.position == dest)
{
if (e.canSeePlayer == true)
{
Vector2 start = dest + new Vector2(12.5f, 14f);
Vector2 end = e.lastSeenPlayer + new Vector2(12.5f, 14f);
List<Vector2> path = new List<Vector2>();
path=e.finder.Find(start, end);//A*算法返回的路径是以(0,0)为原点的
//转换坐标从地图坐标到场景坐标
for (int i = 0; i < path.Count; i++)
{
path[i] = path[i] - new Vector2(12.5f, 14f);
}
e.stateMachine.ChangeState(new WaypointState(path));
return;
}