unity中使用A*算法寻路典例

几个月前开始做那个小游戏时,发现需要用到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;
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值