Riot技术美术总监:《LOL手游》资源管线“不重复造轮子”的艺术

对开发者来说,随着项目越来越大、团队成员越来越多,想要追踪所有游戏资源就变得非常具有挑战性。新成员对项目的不了解、团队之间的沟通成本以及技术门槛等因素的制约,都会降低研发效率,甚至造成大量的重复工作。
在此前的GDC演讲中,Riot Games技术美术总监Sean Low以“不重复造轮子的艺术”为主题,讲述了《英雄联盟手游(League of Legends:Wild Rift)》资源管线的打造过程。
以下是GameLook听译的完整内容:
Sean Low:
今天分享的主题是“在英雄联盟手游资源管线不重复造轮子的艺术”,我是Sean Low,在Riot Games担任技术美术总监。
图片
开始之前,快速做个自我介绍,我开始做游戏是加入迪士尼互动(Disney Interactive),在《Disney Infinity》系列(2和3)担任技术美术、负责工具研发。《Disney Infinity》是个很大的项目,我们需要与迪士尼、漫威以及卢卡斯影业等工作室合作打造与IP相关的所有东西。在《Disney Infinity》研发期间,我学到了很多,而且还参与了很多未发行游戏的创意原型和研发。
随后加入了Unity Technologies,在全身投入到实时演算CG动画《ADAM》项目之前为多个demo团队服务,《ADAM》是个野心很大的项目,因为我们希望通过用它来证明游戏引擎也可以打造高保真电影。这个项目成功之后,我们团队开始与迪士尼TV合作,我们希望证明游戏引擎也可以用来制作动画内容,比如《Baymax Dreams(大白的梦)》。我在Unity最后的工作是负责Unity引擎所有的编辑器界面,这个工作正式开始于2019年3月份,在这个项目上,我和很多工程以及设计团队一起合作。
现在我加入了Riot Games,主要从事《英雄联盟手游》项目,刚开始加入的时候我都没有意识到它是什么,所以为它做个简单介绍:
这是一款MOBA手游,是移动平台版本的《英雄联盟》,你和你的对手们都会进入游戏组成5人团队,每个人都要选择一个英雄,随后10人被分成红蓝双方进入召唤师峡谷,游戏最终目标是推掉对方基地,也可以相互战斗。
在《英雄联盟手游》打造过程中,我们重新打造了全新的美术资源和代码库,这次我们得以从玩法、游戏设计等多个方面了解游戏,带来具有新鲜感的体验。不过,这也意味着我们有大量的工作需要完成,因为我们不仅需要搞定所有的新内容,还需要在很多方面与PC版本的《英雄联盟》保持一致。
《英雄联盟手游》资源管线遇到的问题
对我个人来说,加入这个规模不断扩大的项目是从创意原型研发转向了在线运营,这给我带来一个需要解决的大问题:我们如何让具有很大依赖性的美术资源保持在可追踪的状态?所以今天的分享就是解决这个问题的经验,包括情景、不断扩张的规模、实际部署,以及心得。
英雄资源
我想先说说《英雄联盟手游》的英雄资源,因为它对于MOBA手游来说是非常独特的。对于一个英雄来说,主要分为icon、原画(Splash Art)、游戏内模型以及turntable模型,除了游戏内模型,其它三个都是玩家在战斗开始之前都可以看到的资源,进入游戏之后,游戏内资源才是最重要的,它是最复杂的资源,也是我们今天主要分享的内容。
图片
进入游戏之后,每个英雄都有四个技能需要学习和升级,你可以这四个技能看作英雄的能力,比如火炮、带来AOE伤害或者治疗。对于每个技能,我们都有一套动画、特效和音效与之对应。
图片
比如我们游戏里的辅助、坦克(曙光女神)蕾欧娜,她的第一个技能是破晓之盾,这里你们可以看到在操作这个角色的时候,触发破晓之盾技能看到的效果:
图片
第二个技能是日蚀,第三个技能是天顶之刃,终极技能(大招)是日炎耀斑,可以看到,当她的这些技能被触发的时候,我们需要在地面呈现不一样的特效。
图片
除了英雄原皮之外,我们还有不同的皮肤,主要是用来展示英雄的不同主题或者风格,比如左侧是蕾欧娜的原皮肤,右侧是烧烤女神皮肤,这时候她成为了一名大厨,她的手中剑变成了烧烤叉,盾牌变成了烧烤架。
图片
为了让新皮肤更逼真,我们必须需要把烧烤女神皮肤的网格(mesh)贴到原皮蕾欧娜骨架(skeleton)之上,这样动画效果才会真实。有时候,我们需要做专门的骨骼(bone)、特效,为她做特定的皮肤。
图片
当我们来看英雄资源层级视图的时候,大致如上图所示,我们为每个英雄原皮的每个技能都做了一套动画资源,对于皮肤,我们会在原皮基础上决定是否要做特定资源,比如图中的皮肤1就重做了大招技能动画,对于皮肤2,我们增加了不止一个技能的动画资源,甚至会像皮肤3那样把所有技能都重做一套动画资源。
这其实只是个简化版本,在实际游戏中,我们有些英雄的皮肤很多,而且除了技能之外还需要在角色动作动画增加资源。所以,如果我们想要在游戏里增加一个皮肤,工作就会变得非常令人困惑和棘手。
如今,我们游戏里的英雄数量已经超过了100个,缩小之后看起来是这样的:
图片
不断扩张的规模
《英雄联盟手游》最初是一个比较小的研发项目,我们最初的目标只是想知道,如果想把《英雄联盟》推向移动平台需要做什么样的工作、如何把工作做好。从一个功能到另一个功能,我们越做越多,突然就接近了Alpha测试,随后是在一些区域开放测试,接着就全球发布,如今迎来了数以百万计的用户量。
为了满足玩家预期,我们就必须推出更多内容,意味着做更多的英雄和皮肤,比如在Alpha期间,我们只有40个英雄而且没做皮肤,前不久的版本中,就已经有了68个英雄、189款皮肤,而且这个数字还在不断增长。
图片
由于需要做更多内容,我们也需要更多人手,所以团队规模也快速增长。
不过,当我们只有10人研发小团队的时候,追踪特定资源是很容易的,并且可以通过交流提出不同的想法。然而,随着游戏团队越来越大,加上需要处理内部团队和外部团队协同,以往的方法很快就变得不可持续了。
为了展示具体问题,这是我与一个团队成员聊天遇到的问题:
图片
同事问能否给他(九尾妖狐)阿狸模型,我需要确认是哪一个,当对方回答最新版之后,还要问他是游戏内模型还是turntable模型,然后再确定是哪个皮肤的对应模型。
图片
即便到了这一步,我还是需要确认哪一个皮肤版本,比如2018年我们在PC版本发布了K/DA老版本,然后在2020年推出了面向双平台的新版本。通过这个例子,你们应该可以看到这个过程有多复杂。
图片
更糟糕的是,随着疫情爆发,我们的研发还从办公室转向了居家办公。试想,从10人小团队在同一个办公室内面对面沟通,到社交隔离之后,你以往可以依赖团队成员协同快速解决问题,但疫情之后就只能孤军奋战,任何信息都需要通过线上工具和视频通话交流,这让你想要得到可靠的答案或者信息变得更难。
总结来说,我们遇到的问题有三个方面:复杂的资源层级结构、迅速增长的团队规模,以及居家办公导致的沟通难题。结果就是,原本简单的资源追踪都变成了很痛苦的事情。
寻找解决方案的目标与限制
我们需要一个工具,能够快速得到资源的广度和深度信息,广度方面比如我们现在有多少个英雄?目前版本有多少个辅助坦克?深度方面,烧烤女神皮肤大招需要的动画列表是什么?
局限在于,我们一个前提是,没办法重做工作流程,因为内容制作已经全力在做,如果重做很可能无法满足内容发布要求,这就意味着引入新流程“重做轮子”是不现实的。
发现
图片
那么,我们现在需要知道什么?在哪里可以找到答案?这就让我们进入了发现阶段。
我们采取的第一个方法就是研究项目中现有的技术,这是很重要的一步,我需要知道我们已经或者在近期可能有什么技术,所以甚至需要做一些设想。我查询了大量的文档,并且与美术、工程师甚至是策划团队领导进行沟通,充分了解我们项目的美术资源是如何创作以及被使用的。
这个过程中,我发现一个重要的事情是,我们游戏里有一个内部游戏逻辑系统用来设置游戏里的每个英雄,比如在英雄释放技能期间使用哪个英雄动画?或者玩家使用某个英雄皮肤的时候加载哪一个模型?这个系统根据不同用途分布在不同地方,但这是没有关系的,我只需要知道从哪里找到它们。
图片
比较好的消息是,这些系统都是用.json进行序列化的,意味着我不需要任何多余的工具就可以输出,因此在这种情况下,我们项目中定制化的工具帮我解决了首个重要的问题。
需要强调的是,这种小众化的工具刚开始通常是比较难以理解的,比如相关文档可能已经丢失,即使存在,也可能因为项目进展而显得过时。因此,当没有文档的时候,我就需要与团队甚至是具体的某个人进行核对,当文档和团队都没有的时候,我就不得不写代码,通过代码分析找到答案。
这是很困难的,但带来的帮助也很大,如果你能够降低研发工具的门槛,那么投入的努力就都是值得的,至少对我而言。
图片
接下来是免费工具,我们使用了Unity资源系统,比如prefab系统和.meta文件,由于这些都是统一的,可以运用于所有的Unity项目,所以可以围绕它来打造工具。在一个Unity prefab文件里,它实际上存储了一个游戏对象,包含了它的所有的组件、属性值,甚至是其中的游戏子对象。它就像是一个表格,我们用它来配置《英雄联盟手游》里的很多资源,包括游戏里的英雄。
Meta文件用于存储独特的id或者是Unity一开始分配的id,这两个Unity功能在我做工具的时候带来了很大帮助,后续我会更详细说到。这些系统的优势在于,它们的相关知识都是向公众开放的,在官方文档以及社区论坛都可以找到资料,因此这些工具的学习门槛比之前提到的内部工具低很多。
图片
我们的最后一个发现,是命名传统,你们可能听过无数次,我这里列举的都是资源相关的内容,它们的命名传统是非常重要的。我们将其分为两个类别,一类是文件夹、文件命名这样的系统资源,另一类是美术资源,比如套索、动画、特效。
比如套索,我们可能会以L/R/C等字母来表示它属于资源或者骨架的哪一侧,动画命名可能会有IN/OUT/TRANS,特效可能出现HIT/BUFF等字母来解释其用途。有了连贯且明显的命名传统,很多问题可以立即找到答案。
然而,我们必须知道的是,这样的效果很明显比较弱,如果团队有人不知道这些传统,没有按照这些格式命名,那很容易就会让人困惑。比较幸运的是,我们的团队在这方面做的不错,这些命名传统帮我解决了一部分问题。
解决方案:资源分析工具(aat)
图片
我们的解决方案是一套资源分析工具,它可以用来解释英雄相关的所有资源数据,这种情况下,我们将英雄使用的所有json文件注入了之前提到的游戏逻辑系统。这些文件包括英雄的一些基本信息,比如英雄名字、攻击范围等,我们还可以知道它们的皮肤、技能名字,包括2D资源,更重要的是它们在我们项目里的路径。
图片
有了这些信息,我们就可以用它来加载更细节的资源信息,比如网格、材质、动画、特效等等。
图片
在这些数据基础上,工具会给每个资源类型创造容器(container)来展示我们之前提到过的资源层级视图,比如英雄层级、皮肤层级都有对应的资源,这让接下来的工作更简单、友好。
图片
接下来是资源API,我们希望这个工具可以为所有人带来简单的数据切入点,他们只需要输入aat就可以简单操作。比如输入阿狸,就可以立即找到具体皮肤的资源,或者所有皮肤的资源,这就意味着数据可以通过有序的方式得到,而且很容易根据不同目的进行定制化,带来无尽的可能。
图片
我们能够得到这样的结果,是因为很多的整合,你们可能已经知道,我们是用Python写的这个工具,所以我们首先做的是集成Unity Parser以及YAML这样的功能。这个案例中,Unity Parser是用来传递prefab,这样我就知道这个prefab包含了哪些内容,比如网格和材质,因此我们可以继续追踪这个prefab里的资源。
这时候我们就用到了YAML,它可以帮我们识别正在寻找的资源id,这样我们就可以注入或者加载对应资源,比如我们有很多的FBX文件用于模型和动画,我们将这些工具与FBX SDK进行集成,这不仅让资源追踪更便捷,甚至可以对特定资源进行QA。
图片
你们可能会问,为什么用Python?既然是Unity引擎研发,为什么不用C#呢?后者似乎是更直接的选择,但在《英雄联盟手游》这样的游戏里,用Unity加载一个项目需要5-10分钟,所以我需要的是更轻、更快的工具,当我需要找到答案的时候,最讨厌的就是等待。
另外,我希望这个工具是独立的,也就是不希望它过于依赖我们项目的其他技术,比如我们运行这个工具甚至不必使用Unity引擎,而且大幅增加了迭代效率,让我们的工具研发效率更高。
图片
这就是我们工具得到的结果,它可以让任何人快速得到准确的资源,而且可以根据特定需求进行定制化,并且对特定资源进行分析。
图片
在我们一次视频会议中,有人问,“我们项目里的哪个英雄的多边形最高?”我直接写了一行简单的代码,对比了一些资源数据,就很快得出了结果:萨勒芬妮星籁歌姬(原皮)。设想我在Unity项目直接做这件事会是什么结果:首先需要等5分钟加载所有东西,随后还要通过C#脚本找到最高的模型,然后再用几分钟找到具体的答案。
图片
所以,有了这个工具之后,我们可以用到任何格式中,比如CSV或者Excel文件,因为并不是团队所有人都能写Python脚本。不仅如此,我们还可以将工具与任何框架或者工具连接,比如Maya或者其他单独工具,我们还把这个工具用到了其它项目,甚至可以用到主机、PC游戏,几乎能覆盖Riot所有团队。
研发心得
了解你的游乐场
为了不重复造轮子,我学到的第一件事,就是了解你的游乐场。这里我提到的游乐场,指的是现有的数据和工具,在这样大的项目中,一定会有很多的数据,其中一些是很容易上手的,比如我们的json文件,还有些数据是不存在的,我们必须想办法填补空白。
图片
另外,了解已有工具也是同样重要的,有些工具是定制化的,比如我们提到的游戏逻辑系统,还有些工具是通用的,比如Unity资源系统。得到了这些信息之后,它不仅可以让你掌握整体状况,还可以避免从头开始做重复的事情。
图片
我们更愿意在已有的基础上打造工具,而不是从0开始,这种方式很明显是更快速、更有效率的。这种方法的不利在于,了解已有信息可能需要付出更多的沟通成本,但是从长期利益来看,这些都是值得的。
对的工具和前瞻性计划
图片
第二个心得,就是选择对的工具并打造一个具有前瞻性的计划。
图片
我们希望自己选择的工具是很容易做长期支持的,而不是一个5年内就可能过期的方案。我们还希望这个工具更灵活,可以在必要的时候做出调整,很容易运用到其他甚至是未来产品中。另外,我们还希望这个工具的依赖性很低,这样不需要太多的风险就可以继续迭代。
我们选择Python写这个工具是非常适合团队的,首先Riot团队已经有很多的Python用户,意味着学习门槛较低。与此同时,这还意味着在我们需要帮助的时候可以很容易得到支持,因此在技术和人员支持方面都比较容易做到,谈到支持,Python有官方支持还有很活跃的社区,这让我们更有信心。在我们没有开始做这个工具之前,就希望它的技术依赖性很低。
快速试错
图片
最后一个心得,特别是对我来说最重要的是,一开始保持小规模,这样才能快速开始,也就是很多人提到的“fail fast”。在创意阶段,你可以很快向同事展示对应的结果,更早地发现问题。
图片
通过这种方式,你可以将项目模块化,通过一些小组件的叠加得到更大的部分,你可以复用一些内容,甚至在必要的时候很容易拿掉不需要的模块。我非常相信,《英雄联盟手游》会有更大的潜力。
图片
总的来说,对我而言,如果想要避免“重复造轮子”,最重要的是整合,你们可能在此之前听过很多次,我打造这个工具的方式就是合作精神,而且我觉得这比所有权更重要,这在《英雄联盟手游》很重要,我们与全球很多伙伴合作,只有这样才能给我们的玩家带来令人惊艳的手游体验。
作为技术美术,我们的职责就是将技术和艺术融合,实现更好的体验,协同合作比各扫门前雪更有趣,尤其是在我们都已经居家办公一年多的情况下,我鼓励所有人积极合作,如今短暂的社交隔离,不是我们停止协作的理由,相信我们很快就可以走出家门,再次到办公室一起合作,参加业内活动。
图片
最后,1+1>2,我们在一起的时候更好,希望今天的分享给你们的工作、管线、游戏,甚至是团队、伙伴之间的工作关系带来帮助,让我们共同创造更有趣、更精彩、更好的游戏。
····· End ·····
GameLook每日游戏产业报道
全球视野 / 深度有料