先搭个场景,建好脚本
新建一个障碍物层,需要射线检测
先写Node和Grid,做一些初始化的工作,Node不用继承MonoBehaviour
//Node的内部参数
public bool _canwalk;//是不是障碍物
public Vector3 _worldPos;//真实世界坐标
public int _gridX, _gridY;//节点内部坐标
public int gCost;//初始点
public int hCost;//目标点
//预估值
public int fCost
{
get { return gCost + hCost; }
}
public Node parent;//父节点
//构造
public Node(bool Canwalk, Vector3 Postion, int x, int y)
{
_canwalk = Canwalk;
_worldPos = Postion;
_gridX = x;
_gridY = y;
}
///Grid的初始化工作
private Node[,] grid;//
public Vector2 gridSize;//地图大小
public float nodeRadius;//节点半径
private float nodeDiameter;//节点直径
public LayerMask WhatLayer;//障碍层
public GameObject player;
public int gridCntX, gridCntY;//格子数量
public List<Node> path = new List<Node>();
// Use this for initialization
void Start () {
nodeDiameter = nodeRadius * 2;
gridCntX =Mathf.RoundToInt( gridSize.x / nodeDiameter);//一行几个网格
gridCntY = Mathf.RoundToInt(gridSize.y / nodeDiameter);//一列几个网格
grid = new Node[gridCntX, gridCntY];//初始化网格二维数组
CreatGrid();//实例化格子
}
private void CreatGrid()
{
Vector3 startPoint = transform.position - gridSize.x / 2 * Vector3.right
-Vector3.forward*gridSize.y/2;//从地图左下角开始
for (int i = 0; i < gridCntX; i++)
{
for (int j = 0; j < gridCntY; j++)
{
Vector3 worldPoint = startPoint + Vector3.right *(i* nodeDiameter+nodeRadius)
+Vector3.forward * (j* nodeDiameter + nodeRadius);//世界坐标
bool walkable = !Physics.CheckSphere(worldPoint, nodeRadius, WhatLayer);//球形射线检测障碍物
grid[i, j] = new Node(walkable,worldPoint,i,j);//传递参数
}
}
}
现在地图就网格化了,可以用OnDrawGizmos查看
Gizmos.DrawWireCube(transform.position, new Vector3(gridSize.x, 1, gridSize.y));
if (grid == null) return;
foreach (var node in grid)
{
Gizmos.color = node._canwalk ? Color.white : Color.red;
Gizmos.DrawCube(node._worldPos, Vector3.one*(nodeDiameter-.1f));
}
下回添加player和target开始搜索