• Unity2D-怪物AI启发式寻路算法(多目标,任意怪物大小,攻击范围)


    完整工程下载在最后,先上效果:请添加图片描述

    红色方块为怪物体积大小为2x2个数1。
    黄色为目标个数3。
    白色点为障碍物。
    怪物攻击范围2x2(自身大小)。
    (这里为了方便观看,对算法每一步都进行了延时)

    请添加图片描述

    怪物大小1x1,怪物攻击范围1x1(自身大小)。
    搜索过程中出现的红色路线就是路径,最后重新绘制的红色路径为对允许斜方向行走的路径。

    实现步骤

    1. 使用BFS(广度优先搜索)
      每次将当前搜索位置周围的位置加入到搜索队列。

    周围位置是一个抽象的概念,如果加入为 上下左右,4个方向,那么每次就只会在4个方向进行挑选最优路径。

    扩展一下:
    Q:如果我需要进行任意角度斜着走呢?如果我需要45度角走呢?
    A:那么只需要改变周围位置的定义即可。

    添加优先条件

    其实就是对BFS进行了优先级排序,每次选取目标都从我们计算出的最优值进行搜索。(这样搜索就是有目的性的)
    即:BFS + 优先队列 = A*,(这差不多就是A*的核心思想了,优先队列只是一种选最优的方法)

    如何找到最优路径

    可以先假设我们已经找到了最优路径,那么最优路径有哪些性质?
    对于每一个点我总是能到达,只是到达方式不同,导致到达使用的步数不同。因此我们可以在地图中记录到达这个点当前点使用的最小步数。如果有更小的步数的走法,我们就覆盖掉它。
    通过记录最小步数来源的方向我们可以还原整条路径。(当然对于任意方向,如8方向同理)。

    在这里插入图片描述

    实现碰撞体积

    实现体积的需要处理的其实只有两个部分。

    • 物体的中心在哪?
    • 物体的体积怎么表示
      当我们确定体积的表示方法后就简单了:
      我们只需要在搜索过程中使用对每个体积单位进行碰撞检查就可以!

    如何动态搜索多个目标

    1. 一种最简单的方法就是搜索多次,每次对不同的目标进行搜索
      这种方法的弊端很明显,就是随着目标的增多,搜索次数会不断增大。
      而且在第一个目标的搜索中我们已经知道了很多地方的最短来源,而搜索第二个目标的时候却需要重新搜索,这实在是一种浪费。

    顶部的演示图就是使用这种方法。切换到多目标同时搜索很容易。

    1. 同时对多个目标进行搜索
      每次搜索都将多个目标的距离进行计算对比,并且只走最短的那条路。
      这种方式的优点就很明显,可以对很多目标进行搜索,并且快速选出最短的那个。

    下面是使用同时搜索多个目标,并且只找最近目标的路径。
    请添加图片描述

    演示时使用的配置信息:
    在这里插入图片描述

    项目完整演示包:
    https://download.csdn.net/download/qq_41709801/86911269

  • 相关阅读:
    线代 | 【提神醒脑】自用笔记串联三 —— 相似对角化 · 二次型 · 合同变换
    Kotlin 变量详解:声明、赋值与最佳实践指南
    Express 1 快速入门 - 安装
    多个JSON文件中目标Key值检索
    java8-17 --- Stream流
    第四次数据库作业
    Nacos官网 镜像及使用记录
    centos7 firewalld ip转发设置、安装docker-compose出现错误、docker-compose部署Yapi
    php cli 多进程编程
    抖音文案怎么写合适|成都聚华祥
  • 原文地址:https://blog.csdn.net/qq_41709801/article/details/127689213