Notifications
Article
使用Unity ML-Agents Toolkit训练的可爱柯基犬Puppo
Published 11 days ago
36
0
创作游戏是一个充满创造性的过程,涉及许多具有挑战性的步骤,包括定义游戏内容和逻辑,构建资源和动画,指定NPC行为,调整难度和平衡,以及发布前通过真实玩家进行测试游戏。我们相信机器学习可应用于游戏创作整个过程,本文将聚焦其中一个挑战:指定NPC行为。
传统意义而言,NPC行为是使用脚本和行为树硬编码实现的。其中,冗长的规则表会处理NPC周围环境的信息,决定下一步行为。随着游戏更新,编写和维护这些规则可能非常耗时。
强化学习为定义NPC行为提供了一个很好的替代方案,你可以通过在NPC实现预期目标时提供奖励来训练NPC,而不是手动定义观测到动作映射。

小狗的训练方法

使用强化学习训练NPC的过程非常类似我们训练小狗取物。
我们会给小狗展示一个零食,然后扔出木棍。起初小狗会四处游荡,不知道该怎么做,直到它最终捡起木棍并将其带回来,会得到零食奖励。经过几次训练后,小狗就知道取回木棍是得到奖励的最好方法,然后会继续这样做。
这就是强化学习训练NPC行为的方法。每当NPC正确完成任务时,我们会给NPC提供奖励。通过多次模拟该游戏,等同于多次取物训练,NPC会构建一个内部模型,用于定义每个实例中需要执行什么行为来获取最大化的奖励,从而得到理想行为。
因此,我们不用为NPC的每个观测制作并维护低级动作,我们只需要在正确完成任务时提供高级奖励,就可以让NPC学会合适的低级行为。

柯基犬Puppo

为了展示这种方法的有效性,我们制作了演示移动游戏“Puppo, The Corgi”(柯基犬Puppo),并在Unite Berlin上展示。
玩家可以滑动屏幕来给Puppo扔出木棍,然后Puppo会将木棍带回来。虽然更高级别的游戏逻辑使用了传统的脚本功能,但小狗是使用强化学习来学习行走、奔跑、跳跃和取回木棍的。而不是使用动画或脚本行为,柯基犬的运动仅通过强化学习进行训练。
Puppo不仅看起来非常可爱,而且它的动作完全受到物理引擎控制,这意味着小狗的动作会受周围刚体的影响。
Puppo在Unite Berlin上大受欢迎,许多开发者都想知道它是如何制作的。所以我们决定发表这篇文章,并提供该项目以供开发者进行尝试。
下载Unity项目:
https://s3.amazonaws.com/unity-ml-agents/demos/v0.5/PuppoDemo.zip

创作游戏Puppo

本文首先会介绍训练小狗前的要求和准备工作,然后分享训练小狗时得到的经验,最后说明使用Puppo制作游戏的详细步骤。

1.准备工作

首先,让我们定义强化学习中的几个重要概念。
强化学习的目标是让代理学习策略。代理是与环境交互的实体,每个学习阶段中,代理会收集有关环境状态的观测,执行动作,然后获得该动作的奖励。
策略会根据得到的观测定义代理的动作。在代理执行合适行为时,我们可以通过奖励代理来制定策略。
在我们的示例中,环境是游戏场景,代理是Puppo。Puppo需要学习一个策略,以便和我们一起玩取物游戏。类似我们训练真正的小狗,我们可以通过适当的奖励训练Puppo。
我们使用Unity内置的Ragdoll Wizard工具来制作Puppo,它的腿通过关节动力控制。因此,为了让Puppo学会如何到达目标位置,必须首先学会如何旋转关节动力来进行移动。
真正的小狗通过视觉和其它感官定位自己并决定去哪里,Puppo使用相同的方法。它会收集有关场景的观测结果,例如:与目标之间的距离,自己和目标的相对位置以及自己腿部的方向,从而决定下一步要执行什么动作。Puppo的示例中,动作会描述如何旋转关节动力来进行移动。
每次Puppo执行动作后,我们都会给代理提供奖励,奖励包括:
  • 方向增益:当Puppo朝着目标移动时,我们会给予奖励。该功能使用Vector3.Dot()方法来实现。
  • 时间惩罚:我们会在每个动作时给予Puppo固定惩罚。这样Puppo将学会尽可能快地取回棍子,避免过多的时间惩罚。
  • 旋转惩罚:如果Puppo旋转次数过多,它会受到惩罚。现实中,如果小狗转得太多,它会头晕目眩。为了使游戏更为真实,Puppo转身太快时会受到惩罚。
  • 获取目标奖励:最重要的是Puppo到达目标位置时会得到奖励。

2.训练Puppo

现在Puppo已准备好进行学习,我们在笔记本电脑上花费了二个小时让小狗学会有效地奔向目标。
在训练过程中,我们注意到一个有趣的行为。小狗只用了一分钟就学会了行走。随着训练的继续进行,小狗学会了奔跑。不久以后,当Puppo在奔跑过程中突然转弯时,它会开始翻转身体。小狗学会了如何返回,就像真正的小狗一样。这样笨拙的行为非常可爱,你可以在此时停止训练,将它直接应用在游戏中。
如果你有兴趣自己训练Puppo,可以查看项目中的指南并进行操作,其中包含如何设置训练过程的详细步骤,以及应该选取的参数。

3.使用Puppo创建游戏

为了制作“Puppo, The Corgi”游戏,我们需要定义游戏逻辑,控制玩家与训练模型之间的交互。因为Puppo已经学会如何跑向目标,我们需要实现在游戏中修改Puppo目标的逻辑。
在游戏模式中,我们会在玩家扔出木棍后设置目标。当Puppo到达木棍位置后,我们会将Puppo的目标改为玩家在场景中的位置,于是Puppo会将木棍带给玩家。这样做是因为,使用脚本定义游戏流逻辑的话,训练Puppo向对象移动的过程会更简单。
我们相信,机器学习和传统游戏开发方法可以结合使用,从而发挥二个方法的最佳效果。“Puppo, The Corgi”包含小狗的预训练模型,可以直接使用,或部署到移动设备。

小结

我们希望本文能帮助你了解ML-Agents Toolkit在游戏开发中能够实现什么功能,更多Unity机器学习相关内容尽在Unity官方中文论坛(UnityChina.cn)!

Unity China
316
Comments