【Unity】 坦克寻路

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/birdy_/article/details/81109472

这是一篇残缺不全的记录……

Unity寻路所有的资料大概都是NavMesh吧。本来这一块跟我没啥关系,后来队友告诉我:NavMesh没法模拟坦克的转向。
我也不知道是怎样勇气打算试一下机器学习?反正最后凉了想看解决方法的散了吧……

配环境啥的都不说了。
agent的移动方式是转向和向前向后运动,就是基本的坦克的运动。
提醒一个问题就是如果是用

Input.GetAxis("Vertical")

来判断方向的话,这个值在brain设置为player的时候是对的但是在训练的时候是0……

一开始设计的是

  • 奖励
    • +2 看到目标(正前方的射线检测到目标并且在一定距离内)
    • -0.01 每步
    • +0.02 如果这一次比上一次更接近目标点
    • -1 坦克掉下去
  • 重置条件
    • 坦克的 y < 正常值(掉了下去)
    • 目标的 y < 正常值(也是掉下去了)
    • 坦克长期不移动(可能卡在了哪里)
    • 目标在坦克视线范围内

我还加过一个重置条件是当超过一定时间还没有找到目标的时候,重置目标的位置。无法评价这个决策的好坏……就不在这里加了。

这样训练的结果是,坦克开始疯狂撞墙——可能是由于它找到目标的概率太低了。

于是我开始考虑增加找到目标的概率。
虽然坦克需要处于攻击状态的话,最后是要面向目标。但是一旦我方的坦克和对方之间没有障碍物的话,就意味着我可以在后期通过转向来解决面向目标这个问题。
于是奖励改为

  • +2 能够看到目标(坦克朝着目标方向发射,能检测到目标)

即使这样,坦克也还在撞墙……因为设置的是离散的碰撞检测,所以坦克偶尔会穿透外墙(真努力啊……)掉下去。可能觉得这样的重置条件比较容易满足……
觉得设成连续的成本太高了,于是随手加了一道惩罚

  • -1 坦克撞墙

然后坦克果然不撞墙了——
它开始左右横跳。

原因大概就是,我给(接近目的地)的奖励太高了。让它觉得(拿一半奖励是一个不差的选择……)
于是修改为

  • -0.001 * 坦克到目标的距离

然后它也不跳了。我也不知道发生了啥全世界乱走……走到不知道哪就愣住不动了……啊啊啊……

因为等很久也就偶尔的遇到那么一两次目标。感觉这样训练成本太高了……而且好像Unity的训练还用的CPU……想想就很绝望。

于是懒惰的我开始寻找其他解决方案。
我找的两个方案。
https://connect.unity.com/p/pancake-bot?_ga=2.77336086.286916845.1531878685-422510572.1515301463
这个网站中的Pass the butter
以及例程中的
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Examples.md#pyramids

非常的神奇的一点就是,Unity的ML感觉有一种看着它发展起来的感觉。对比一下中英文文档可以看到历史版本和现在的版本……这个例程也是这几个月才发布的。可能对于感觉自己一直学着上世纪知识的我第一次感觉到开发的进程?(雾)
或许几个月后Unity就发展到,我就不需要思考这个问题了。

从效果看我选了例程那一个(突然找不到视频了但是效果真的蛮好的……可以下下来跑跑看)。
它的条件非常的简单,只有

  • Agent Reward Function (independent):
    • +2 For moving to golden brick (minus 0.001 per step).

不知道训练了多久能到这个效果……
照这个情况,理论上我之前的模型效果肯定不会差啊(怎么就这么随意的凉了)。

不管了努力的迁移一下……
(找不到视频真难过)

黑色的射线是小物体在不断的找开关,接触到了开关之后会出现目标点,目标点还在空中。这个场景其实蛮好的,因为它不需要全局信息,模拟出的结果就是(坦克在不知道敌人在哪的时候不断的寻找,如果你能够躲在什么物体后面的话它会看不到你。)但是理想很美好……
不管怎么说,我认为只要让本来传入开关的参数一直设为false,这样这个物体就会不断的寻找关闭着的开关。
为了达到坦克远程射击的效果,在行为树的上层插入(判断和目标直接的连线有没有遮挡)。这样就能实现和之前类似的效果。
我觉得效果还行,看起来最后的问题应该就是调整一下在真实场景里的尺寸就行了。
于是我尝试把坦克扔进了我们的游戏场景。
但是一运行坦克又开始疯狂撞墙……
调了很久的参数,还是没有办法达到一个足够好的效果。总是转个向就撞了之类的。

就这样我发现我们的游戏和训练的场景还是有比较大的差距的。或许这个场景在它的眼中类似于
这里写图片描述
我不是指只有一条可以到达的路……而是,我站在中间,可能周围的东西离我非常的近。
之前的场景,agent可以做到一直往前移动,而训练结果也确实是这样的。它不断交替转向和前进的命令,就可以实现转弯。而在现在的场景里,很多时候仅仅转弯是不够的,很可能需要坦克在原地的转向。而这种拥塞的地形是这个训练模型无法达到的……

还能怎么办呢……我现在在认真考虑要不要手撸一个寻路算法…

猜你喜欢

转载自blog.csdn.net/birdy_/article/details/81109472