首页 > 编程语言 >Unity A*寻路算法

Unity A*寻路算法

时间:2024-05-26 23:30:03浏览次数:23  
标签:格子 OpenList 寻路 算法 Unity 计算 Navigation

前言:为什么要使用A*寻路算法,不直接使用unity自带的Navigation组件呢?

  1. 灵活性高

    • A*算法允许开发者根据具体游戏需求调整和优化算法实现,比如通过改变启发式函数来适应不同的地图和寻路条件。
    • Unity的Navigation组件虽然强大,但在一些特殊场景或需要高度定制的路径计算中可能不够灵活。
  2. 效率高

    • A*算法结合了Dijkstra算法的最短路径搜索和贪心算法的启发式搜索,能有效减少不必要的搜索,从而提高寻路效率。
    • 尽管Unity的Navigation系统也进行了优化,但在某些复杂场景下,自定义的A*算法可能会提供更好的性能表现。
  3. 可拓展性强

    • A*算法易于扩展和维护,开发者可以根据项目的实际需要添加新的功能或者进行调试。
    • Unity的Navigation系统虽然提供了可视化工具和诸多功能,但在进行特定扩展时可能需要更多的工作。
  4. 支持二维与三维环境

    • Unity的Navigation组件主要针对3D环境设计,对于2D游戏的路径寻找支持不如A*算法直接和高效。
  5. 适应多种场景的需求

    在不同的游戏开发项目中,地图和场景的设计差异较大,A*算法因其灵活性和适应性被广泛采用

Navigation组件的局限性:

  1. 烘焙时间和资源消耗:对于大型或复杂场景,Navigation组件的烘焙过程可能会非常耗时且消耗大量资源。

  2. 动态环境的处理:尽管新版Unity Navigation系统支持动态烘焙,但在处理频繁变化的场景时仍可能面临性能挑战。

  3. 易用性与控制权衡:Navigation组件虽然简化了寻路设置,但同时也牺牲了某些高级功能和自定义选项,这在需要精确控制的游戏设计中可能是一个缺点

A*寻路的算法估价

在A算法中核心的寻路依据就是估量代价,在A*寻路算法中通常用F表示。

F=G+H
其中G表示当前点到起始点的估量代价,表示当前点到终点的代价。

G的计算方式:最开始,以起点为中心开始计算周边的八个格子,然后在以这算出来的八个
格子为中心,继续计算他们周边的八个格子的G值,在计算的时候区域有所覆盖,如果计算出来的值小于格子目前的G值,该格子的G值就要更新为较小的G值。以此类推,直到找到终点,遍历完所有的格子。G值的计算结果为:中心点的G值+距离值【10or14】

设定每个格子之间的距离为10,那么从中心的格子到对角线之间的距离就是两个格子中心之间的连线,也就是14,G值为左下角的数值,H值为右下角的数值,F值为左上角数值,默认起点的G值为0

 H的计算方式:H值是从当前点到终点的预估代价。这个值的计算通常基于某种启发式方法,以估算剩余距离。一个简单的启发式方法是使用欧几里得距离,即在二维空间中,两点间的直线距离可以通过勾股定理来计算。

A*寻路算法的具体步骤及代码

每次计算G和H的时候建立下面这样的表格,找到F值最小的格子,然后再通过该格子找到周围的8个格子再次建立,这样的表格,找到F值最小的格子,以此递归,直到找到终点为止,每次当过中心点的格子会被记录起来来防止下次再次经过这个格子。A*寻路算法的本质就是通过终点回溯来找到最短路径。

序号GHF
1101020
2101424
3101020

步骤

  1. 设置开放列表OpenList和关闭列表CloseList;
  2. 将起点放到OpenList;
  3. 开启循环While(OpenList.count > 0)

        3.1 将OpenList按照F值从小到大排序

        3.2 OpenList[0]的值必是最小的,命名为center

                3.2.1发现Centeri就是终点,回溯找到导航路径
 

        3.3 以这个点为中心去计算周边的8个格子的三个值

        3.4 如果这个格子没有被计算过或者原来的G值比这次计算的还要大

                3.4.1 此时设置新的FGH值给该格子,并设置该格子的发现者为center

        3.5 如果这个格子被计算过,且原G值比这次计算的要小

                3.5.1 此时就不能替换原来的FGH值

        3.6 将发现的每个格子放入OpenList

                3.6.1 放入的时候要检测【该格子不在OpenList,该格子不在CloseList】

        3.7 将此次的发现者Center放入CloseList中

        3.8 判断OpenList为空

                3.8.1 说明所有的可发现的格子都被遍历过了,始终没有找到中,说明无法到达终点

标签:格子,OpenList,寻路,算法,Unity,计算,Navigation
From: https://blog.csdn.net/weixin_74960198/article/details/139198436

相关文章

  • 算法策略的总结
    一、不同算法策略特点小结1、贪心策略   贪心策略一方面是求解过程比较简单的算法,另一方面它又是对能适用问题的条件要求最严格(即适用范围很小)的算法。   贪心策略解决问题是按一定顺序,在只考虑当前局部信息的情况下,就做出一定的决策,最终得出问题的解。   即:通......
  • Apollo 计算几何算法
    Apollo 计算几何算法1. 介绍Planning 模块中, 路径和速度曲线都被抽象成 Polyline, 障碍物被抽象成 Polygon. 在碰撞检测、投影计算距离、平滑曲线等方面都大量运用到了几何算法. 在本文中, 将介绍 Apollo 所用到的计算几何相关的基础库, 包括LineSegment2d......
  • 算法刷题笔记 前缀和(C++实现)
    文章目录题目描述基本思路实现代码题目描述输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l,r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数......
  • 算法刷题笔记 数的范围(C++实现)(二分法重要例题)
    文章目录题目描述题目思路题目代码(C++)题目感想题目描述给定一个按照升序排列的长度为n的整数数组,以及q个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回-1-1。输入格式:第一行包含整数n和q,表示数组长度和询......
  • 二叉树遍历算法与堆数据结构详解(C语言)
    目录树的概念及结构二叉树的概念及结构概念二叉树的性质满二叉树和完全二叉树满二叉树完全二叉树深度的计算二叉树顺序结构及实现顺序存储堆的概念数组建堆向下调整堆的实现完整代码Heap.hHeap.cTest.c堆的初始化(实现小堆为例)插入数据删除堆顶的数据 ......
  • C语言----判断n是否是2的次方数,利用到按位与&,算法n&(n-1)
    //写一个代码,判断n是否是2的次方数//if(n&(n-1))==0/*2的0次方是1---二进制12的1次方是2---二进制102的2次方是4---二进制1002的一次方-1是1---二进制是12的二次方-1是3---二进制是112的三次方-1是7---二进制是111n与n-1按位与后&是0就是0,两个1才是1所以if(n&(n-1......
  • 算法课程笔记——KMP&字符串哈希
    算法课程笔记——KMP&字符串哈希就是模板题aba是前后缀,真前后缀就只有a/b /a避免出现不同字符有相同的值相当于进制如果你能熟练掌握正则表达式,用库还能更快......
  • 「贪心算法」摆动序列
    力扣原题链接,点击跳转。如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。简单来说,摆动序列的特点是:后一个数交替地比前一个数大或者小。给你一个数组,请......
  • 【路径规划】基于遗传算法求解带时间窗容量限制的单配送中心多骑手外卖配送路径规划问
    研究背景:随着外卖业务的快速发展,如何合理安排多骑手的配送路径,减少配送时间和成本,成为外卖平台需要解决的重要问题。在实际操作中,骑手需要在一定的时间窗内完成配送,并且配送中心的配送能力也有限,因此需要考虑时间窗和容量限制的多骑手外卖配送路径规划问题。研究步骤:理解......
  • 【机器学习-23】关联规则(Apriori)算法:介绍、应用与实现
    在现代数据分析中,经常需要从大规模数据集中挖掘有用的信息。关联规则挖掘是一种强大的技术,可以揭示数据中的隐藏关系和规律。本文将介绍如何使用Python进行关联规则挖掘,以帮助您发现数据中的有趣模式。一、引言1.简要介绍关联规则学习的概念和重要性关联规则学习是一种......