Unity3d自学记录 A*算法实现

概述

使用上下左右移动浅黄色方块,黑色方块每三秒进行寻路一次,路径被红色方块进行标记,黑色方块沿着红色方块追踪浅黄色方块。

实现过程中遇到的坑点

1. Destroy

这里用到小正方标记路径,更新的时候会Destroy之前的小方块,再加上之前的做法直接是获取小正方体的位置,然后黑色方块进行移动,所以就出现了问题,

Actual object destruction is always delayed until after the current Update loop, but will always be done before rendering.enmmm

显而易见,我将会多获取一些使用了Destroy方法的但是在当前loop里还没destroy的小正方体,后来的解决办法为直接获取pathList中的position。

2.Transform.GetChild

原本是for循环遍历获取的小正方体,进行销毁,不知道怎么了,(可能是我飘了)

while(pathRoot.childCount>0)
    Destroy(pathRoot.GetChild(0));

然后陷入了死循环,卡死,无奈,重启Editor,最后才想起来,当前帧Destroy并不会立即生效,所以这段代码相当于一直在Destroy一个已经加入到销毁名单的对象,并且不会报错。

3.Rigidbody.velocity

小黑方块进行追踪的时候,一开始使用了Rigidbody.velocity来进行驱动,但是会有这个情况,在小黑方块还没到达最终点之前,路径变更,由于是我开了协程yield return null,当设置速度为0,停止的时候,都是下一帧的事了,这一帧,小黑方块已经超出了。于是找到了Vector3.MoveTowards,沿直线向目标position进行移动,移动的最大距离是min(当前位置和目标位置的距离,第三个参数),开协程,每帧进行移动。

 实现截图

Unity3d自学记录 A*算法实现_第1张图片

 Demo下载

https://github.com/duan1998/Astar-Algorithm

你可能感兴趣的:(Unity3d)