A*寻路

using UnityEngine;
using System.Collections.Generic;

public class TestXunLu : MonoBehaviour
{
//以点为方格
//A点(起点) [1,2] B点(终点)[6,7]
private List<float[,]> parentPosList = new List<float[,]>();
List<Son> sonList = new List<Son>();
List<Son> parentList = new List<Son>();
List<Son> oldList = new List<Son>();
//障碍物
List<float[,]> barrierPosList = new List<float[,]>();
//防止测试死机
private int n = 0;
private float[,] start = new float[1, 2] { { 1, 2 } };
private float[,] end = new float[1, 2] { { 6, 7 } };

void Start()
{
barrierPosList.Add(new float[,] { { 2, 4 } });
barrierPosList.Add(new float[,] { { 3, 4 } });
barrierPosList.Add(new float[,] { { 4, 4 } });

XunLu(start, end);
}

public void XunLu(float[,] start, float[,] end)
{
//找到起始点A 周围8个点 F=G+H G值由父点决定(决定周围8点) H值由终点B点决定
//需要一个存 父点 的list parent
//首先可以知道start点 周围8点坐标 存到list son 
//存父节点
//List<Son> parent = new List<Son>();
parentPosList.Add(start);
//===
sonList.Clear();
//拿到周围8个点坐标 
Son one = new Son(new float[1, 2] { { start[0, 0], start[0, 1] + 1 } });
Son two = new Son(new float[1, 2] { { start[0, 0] + 1, start[0, 1] + 1 } });
Son three = new Son(new float[1, 2] { { start[0, 0] + 1, start[0, 1] } });
Son four = new Son(new float[1, 2] { { start[0, 0] + 1, start[0, 1] - 1 } });
Son five = new Son(new float[1, 2] { { start[0, 0], start[0, 1] - 1 } });
Son six = new Son(new float[1, 2] { { start[0, 0] - 1, start[0, 1] - 1 } });
Son seven = new Son(new float[1, 2] { { start[0, 0] - 1, start[0, 1] } });
Son eight = new Son(new float[1, 2] { { start[0, 0] - 1, start[0, 1] + 1 } });
sonList.Add(one); sonList.Add(two); sonList.Add(three); sonList.Add(four); sonList.Add(five); sonList.Add(six); sonList.Add(seven); sonList.Add(eight);

n++;
for (int i = 0; i < sonList.Count; i++)
{
if (sonList[i].pos[0, 0] == end[0, 0] && sonList[i].pos[0, 1] == end[0, 1])
{
Debug.Log("路径已经找到!!");
Debug.Log("输出路径:");
for (int j = 0; j < parentPosList.Count; j++)
{
Debug.Log("路径坐标:" + parentPosList[j][0, 0] + " , " + parentPosList[j][0, 1]);
}
return;

}
}
if (n > 100)
{
Debug.Log("n>100 return!!!");
Debug.Log(parentPosList.Count);
return;
}

for (int i = 0; i < sonList.Count; i++)
{
sonList[i].H = (Mathf.Abs(end[0, 0] - sonList[i].pos[0, 0]) + Mathf.Abs(end[0, 1] - sonList[i].pos[0, 1])) * 10;//H
if (sonList[i].pos[0, 0] == start[0, 0] || sonList[i].pos[0, 1] == start[0, 1])
{
sonList[i].G = 10;
}
else
{
sonList[i].G = 14;
}
sonList[i].F = sonList[i].G + sonList[i].H;
}
for (int i = 0; i < sonList.Count; i++)
{
for (int j = 0; j < barrierPosList.Count; j++)
{
if (sonList[i].pos[0, 0] == barrierPosList[j][0, 0] && sonList[i].pos[0, 1] == barrierPosList[j][0, 1])
{
sonList[i].F = 1000;
}
}
}

for (int i = 0; i < sonList.Count - 1; i++)
{
if (sonList[i].F < sonList[i + 1].F)
{
sonList[i + 1] = sonList[i];
}
}

float[,] pos = sonList[7].pos;
XunLu(pos, end);
}

//Node
public class Son
{
public float F;
public float G;
public float H;
public float[,] pos;
public float[,] parentPos;
public Son(float[,] pos)
{
this.pos = pos;
}
}
}

时间: 2024-10-06 20:30:29

A*寻路的相关文章

【转】unity自带寻路Navmesh入门教程(一)

http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图录屏的劳动,如需转载请先告诉我.谢谢! unity自从3.5版本之后,增加了NavMesh寻路的功能.在此之前,unity用户只能通过第三方插件(如Astar寻路插件)等做寻路功能.阿赵我也使用过A*寻路插件,A*的原理并不复杂,有

【转】unity自带寻路Navmesh入门教程(三)

http://liweizhaolili.blog.163.com/blog/static/16230744201271225812998/ 继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果: 第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路线进攻. 第二个例子是动态的控制道路的开关.当吊桥打开时,道路不通,当吊桥放下时,道路可以通行. 先来说说第一个例子吧,第一个例子其实很简单,只需要在之前两节的基

【转】unity自带寻路Navmesh入门教程(二)

http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/ 上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标: 由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分是爬楼梯,第二部分是横向跳跃和往下跳落 不管是爬楼梯,还是跳跃,NavMesh都是通过了OffMeshLink来做的.创建OffMeshLink的方法有两种,接下

这是一个真正靠谱的寻路算法

绝对没有其他看起来高大上 给别人讲都将不明白的理论.管你 人工智能 啥的 ,还有一百度一大篇的a*算法 ,其实大部分文章的理论都是讲不通的 或者没有讲清楚 更别说代码.做事刨根问底的牛脾气又上来了. 两周前 偶然原因接触到了寻路算法 于是百度 找到了a* .讲来将去大概意思就是持续性的找离目标近的节点 并且走过的节点不能重复走.反正百度搜a*算法 一搜一大片.在很简单的障碍的情况下是没问题 : 但是拐个弯就不行了,不是找最近的么,我让你一直找最近的. 直接迂在里面出不来了: 期间我曾经想过为什么

3-4-迷宫寻路-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 迷宫寻路 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c        相关测试数据下载

A*寻路算法入门(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 该篇博客由iOS课程团队的Johann Fradj发布,他现在是一个全职开发iOS的开发者.他是Hot Apps Factory(其是App Cooker的创造者)的共同创建

Unity3d 寻路功能 介绍及项目演示

Unity3d中的寻路,可以使用AStarPath 寻路插件.现在也可以使用Unity自带的 Navigation 功能来做. 来做一个例子: 上面的图片中,Cube 是阻碍物体,球 是代表玩家,要寻路. 设置Cube为不可通过物体 首先我们点击Window - Navigation 窗口,然后选中4个Cube,按照下图设置这4个Cube为不可通过,然后烘培 设置地面为可通过,然后烘培 我们给圆球也就是我们的主角加上控制脚本 using UnityEngine; using System.Col

Unity64 AStarPath 寻路失效 Bug解决 IOS64 IL2CPP - Bad date/time format in the zip file

把游戏项目迁移到IOS64 上面又出现了自动寻路无效的BUG,在XCode Console中有提示AStarpath异常, Bad date/time format in the zip file 在代码中查询得知是AStarpath在初始化时,会读取场景的寻路信息文件,但是由于DonetZip中的一个解析时间的Bug,导致异常,从而没有读取到场景自动寻路信息. 文章来自播客 http://blog.csdn.net/huutu文章来自播客 http://blog.csdn.net/huutu

关于 RecastNavigation 寻路结果异常的问题。

由于我们的项目采用的寻路解决方案是:客户端使用 unity 原生的寻路系统,服务器采用 RecastNavigation 系统,而服务器的寻路数据来自于从 unity 导出的,所以理论上两边的寻路结果应该是一样的,可事实上并非如此,unity 无论如何寻路,都能表现出比较自然的结果,但是服务器却有时会出现比较奇怪的结果. 由以上三张截图可以看到,起始点和终点稍微有点变化,结果就会出现较大的差异,寻路结果往往会“拐弯”,这种结果势必是不能接受的,unity 里不会出现这种情况,经过多次试验并仔细查

unity3d NavMeshAgent 寻路画线/画路径

今天在群里看见有个小伙在问Game视图寻路时怎么画线 正好前几天写了个寻路,而且自己也不知道具体怎么在寻路时画线,所以决定帮帮他,自己也好学习一下 在百度查了一下资料,直接搜寻路画路径.寻路画线...... 我可不是伸手党,我只是想看看别人是怎么实现的 结果什么都没有搜到!!那就直接搜unity3d 画线吧.....  果然很多资料!! Debug.DrawLine:使用这个函数只能在 screen 中看见画的线,在 game 中看不见 那我们要怎么在game中画线呢 百度给我答案:LineRe