手撸一个A*+二叉堆优化(二)

先搭个场景,建好脚本

新建一个障碍物层,需要射线检测

先写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开始搜索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值