几个月前开始做那个小游戏时,发现需要用到A寻路,看了很多讲解,终于把A搞懂了。过程描述:
①:通过循环提取Open-List中的值并不断地比较寻找此时列表中代价最低的路径点,将代价最低点移除Open-List,加入Close-List后进入②。持续循环此步骤直到Open-List中的路径点个数为0。
②:判断此路径点是否为寻路终点,若是则计算路径,直接进入④。否则,获得此点周围的非障碍点,进入③。
③:判断周围非障碍点是否已经存在于Open-List中,如果存在,重新计算并更新路径点代价函数值。如若不存在,计算路径点代价函数值后并将路径点储存在Open-List中。后将①中的提取点与此周围非障碍点设为父子关系,方便于最终路径点的提取。
④:得到最终点,依次根据节点的父子关系寻找父节点并存入数列中,直至寻找到初始路径点。数列中所有点的集合,即为寻路路径。
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//传说中的最优寻路方法,A*
public class Navigation : MonoBehaviour
{
private Vector2 chushiposition;
public GameObject gametest;
public GameObject gametestlujing;
[Range(0.5f, 1f)]
public float lengthofbox;//我的tilemap每个格子是1所以我设置的是1,这个可以根据实际情况改
public LayerMask NodeLayer;//选择障碍物所在的层
public Transform player;//拖上目标对象(被追踪者)
private Transform startPos;
public Transform meshOrigin;//格子起点对象
public class NodeItem
{//单位格子类
public bool iswall;
public Vector2 worldpos;
public int x, y;
public int g;
public int h;
public int f
{
get { return g + h; }
}
public NodeItem parentNode;
public NodeItem(bool iswall, Vector2 worldpos, int x, int y)
{
this.iswall = iswall;
this.worldpos = worldpos;
this.x = x;
this.y = y;
}
}
private NodeItem[,] nodeItems;
private int w, h;
private void Awake()
{//初始化所有格子
chushiposition = this.transform.position;