Unity寻路专题(一)——DFS
前段时间有点小忙,没时间写文章。今天准备开一个新的专题——寻路。寻路在游戏中是不可或缺的一部分,每款游戏都有一套适合自己的寻路算法。我准备把这些整理一下供大家学习。废话不多说,进入正题。说到寻路,最先想到的就是DFS(深度优先搜索)和BFS(广度优先搜索)。这也是寻路的最基础的算法。这两种算法基本思路是一模一样的,只是用到的数据结构不同。前者使用栈,后者使用队列。今天着重介绍DFS,...
·
前段时间有点小忙,没时间写文章。今天准备开一个新的专题——寻路。寻路在游戏中是不可或缺的一部分,每款游戏都有一套适合自己的寻路算法。我准备把这些整理一下供大家学习。废话不多说,进入正题。
说到寻路,最先想到的就是DFS(深度优先搜索)和BFS(广度优先搜索)。这也是寻路的最基础的算法。这两种算法基本思路是一模一样的,只是用到的数据结构不同。前者使用栈,后者使用队列。今天着重介绍DFS,BFS放到下一章。
DFS:Depth
-
First
-
Search
,
顾名思义就是深度越大的节点会被优先拓展,从一个开始节点出发,只要还有后继节点,就一直走下去,不能走了就回溯,然后继续上述操作。通俗来讲,就是一种“不撞南墙不回头”的思想。
代码模板:
①创建一个
Stack
(
栈
)
容器用于存储待访问的节点和一个List用于存储访问过的节点。
②将开始节点放入Stack中,开始循环(循环结束条件是Stack里没有节点了)。
③每次循环中要做的事:
1
、从Stack中弹出一个节点并加入到List里;
2
、把弹出的节点作为当前节点,将当前
点的后继节点(也就是可以直接到达的点,通常为上下左右四个点)放入Stack中
④判断目标节点是否在Stack中,如果在就退出循环,否则继续循环。
源码:
为了方便表示,定义一个结构体。x,y代表着坐标,而parent是为了在找到目标后能通过parent追溯路径。


这里只放了DFS寻路部分,让大家能明白这个过程,还有一部分辅助函数没有放,因为太占篇幅了,我后面会发布到GIthub上,大家下载源码更方便学习。
附上效果图:蓝色格代表搜索范围,黄色代表路径,这个地图的生成在上一篇文章。(PS:其实人物是能沿着路径移动的,我把功能暂时关了)

可以看到DFS寻路找到的路径不是最短路径,并且时间复杂度巨高,十分耗性能,所以我们一般不会使用DFS,但你得知道这个过程。这也是为了更好理解后面更优秀的寻路算法。
更多推荐
所有评论(0)