查看原文
其他

使用Unity ML-Agents Toolkit训练的可爱柯基犬Puppo

Unity Unity官方平台 2019-05-07

创作游戏是一个充满创造性的过程,涉及许多具有挑战性的步骤,包括定义游戏内容和逻辑,构建资源和动画,指定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官方教师培训报名火热进行中

Unity将在10月22-26日,举办为期5天的专业的Unity官方教师培训课程,诚邀广大教师与Unity一同学习分享最新技术!

报名地址:

https://connect.unity.com/events/2018jiaoshipeixun


优惠活动|Unity订阅新起航,开启您的创作之旅

现在访问Unity在线商店(store.unity.com),成功订阅Unity Pro专业版、Unity Plus加强版即可享受全新增值服务组合。11月18日之前订阅,更有指定插件资源限时赠送。

活动地址:https://store.unity.com/cn


点击“阅读原文”访问Unity官方中文论坛

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存