很显然,寻路算法在RPG游戏中的应用领域是很广泛的,最近在研究人工智能的同时,也不禁遇到很多迷茫和困惑,想着还是先从简单的算法开始实现,然后逐渐学习更难的知识,有句话说的好,心急吃不了热豆腐。
首先贴一下大佬博客,我的就是照着大佬做的
https://www.cnblogs.com/yangyxd/articles/5447889.html
这里纯粹是个学习笔记,有幸看到的或许可以对照着去理解?
1. 首先,去理解一下A*算法的原理,这里的话就先借用一下大佬的图
图上有什么,黑方块,白方块,蜘蛛,人,和问号,白方块嘛,能走的区域,黑方块不能走的区域,蜘蛛,起始点,人,最终点,那么我们的A*算法是个什么逻辑呢?寻找周围的8个点(当然这是砖块游戏,很多时候我们可能也是事先规划好的路径点),然后每次移动到一个点,都会计算当前的cost,cost由这个,也就是f,g,h来决定你的消耗,我们每次移动到cost较小的点再计算消耗值
对于这个问题的话给出了三种算法去实现,第一种曼哈顿算法,就是笔直走,到和重点同一水平线的时候再笔直走
第二种的话 几何算法,计算两点直线距离给出估价因子,走路的话就是对角线走法
第三种的话是对角算法,会先一直对角线走直到走到同一水平,就开始直线走
下面是模仿大佬的例子,很显然,通过这个办法,我们确实计算出了两个点之间的路径,当然,目前这种测试还只是在这种规定了像素点的,后续还可不可以用,这个还需要思考
然后的话,我讲一下我对代码的理解吧,贴一下代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public classGrid:MonoBehaviour
{
public GameObjectNodeWall;
public GameObjectNode;
//节点半径
publicfloat NodeRadius = 0.5f;
//过滤墙体所在的层
public LayerMaskWhatLayer ;
//玩家
public Transformplayer;
//目标
public TransformdestPos;
publicclassNodeItem
{
//这里的f,g,h都是用来计算代价的
///寻路节点
//是否是障碍物
publicbool isWall;
//位置
public Vector3 pos;
//格子坐标
publicint x, y;
//与起点的长度
publicint gCost;
//与目标点的长度
publicint hCost;
//总的路径长度
publicint fCost
{
get { return gCost + hCost; }
}
//父节点就是当前节点了,一个节点移动到另一个节点往往是拿周围的八个节点说事
public NodeItem parent;
public NodeItem(bool isWall, Vector3 pos, int x, int y)