3

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

 2 years ago
source link: http://www.gamelook.com.cn/2022/07/490194
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

2022-07-26 • 游戏美术项目开发管理

【GameLook专稿,未经授权不得转载!】

GameLook报道/对开发者来说,随着项目越来越大、团队成员越来越多,想要追踪所有游戏资源就变得非常具有挑战性。新成员对项目的不了解、团队之间的沟通成本以及技术门槛等因素的制约,都会降低研发效率,甚至造成大量的重复工作。

在此前的GDC演讲中,Riot Games技术美术总监Sean Low以“不重复造轮子的艺术”为主题,讲述了《英雄联盟手游(League of Legends:Wild Rift)》资源管线的打造过程。

以下是GameLook听译的完整内容:

Sean Low:

今天分享的主题是“在英雄联盟手游资源管线不重复造轮子的艺术”,我是Sean Low,在Riot Games担任技术美术总监。

lazy.png

开始之前,快速做个自我介绍,我开始做游戏是加入迪士尼互动(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模型,除了游戏内模型,其它三个都是玩家在战斗开始之前都可以看到的资源,进入游戏之后,游戏内资源才是最重要的,它是最复杂的资源,也是我们今天主要分享的内容。

lazy.png

进入游戏之后,每个英雄都有四个技能需要学习和升级,你可以这四个技能看作英雄的能力,比如火炮、带来AOE伤害或者治疗。对于每个技能,我们都有一套动画、特效和音效与之对应。

lazy.png

比如我们游戏里的辅助、坦克(曙光女神)蕾欧娜,她的第一个技能是破晓之盾,这里你们可以看到在操作这个角色的时候,触发破晓之盾技能看到的效果:

lazy.png

第二个技能是日蚀,第三个技能是天顶之刃,终极技能(大招)是日炎耀斑,可以看到,当她的这些技能被触发的时候,我们需要在地面呈现不一样的特效。

lazy.png

除了英雄原皮之外,我们还有不同的皮肤,主要是用来展示英雄的不同主题或者风格,比如左侧是蕾欧娜的原皮肤,右侧是烧烤女神皮肤,这时候她成为了一名大厨,她的手中剑变成了烧烤叉,盾牌变成了烧烤架。

lazy.png

为了让新皮肤更逼真,我们必须需要把烧烤女神皮肤的网格(mesh)贴到原皮蕾欧娜骨架(skeleton)之上,这样动画效果才会真实。有时候,我们需要做专门的骨骼(bone)、特效,为她做特定的皮肤。

lazy.png

当我们来看英雄资源层级视图的时候,大致如上图所示,我们为每个英雄原皮的每个技能都做了一套动画资源,对于皮肤,我们会在原皮基础上决定是否要做特定资源,比如图中的皮肤1就重做了大招技能动画,对于皮肤2,我们增加了不止一个技能的动画资源,甚至会像皮肤3那样把所有技能都重做一套动画资源。

这其实只是个简化版本,在实际游戏中,我们有些英雄的皮肤很多,而且除了技能之外还需要在角色动作动画增加资源。所以,如果我们想要在游戏里增加一个皮肤,工作就会变得非常令人困惑和棘手。

如今,我们游戏里的英雄数量已经超过了100个,缩小之后看起来是这样的:

lazy.png

不断扩张的规模

《英雄联盟手游》最初是一个比较小的研发项目,我们最初的目标只是想知道,如果想把《英雄联盟》推向移动平台需要做什么样的工作、如何把工作做好。从一个功能到另一个功能,我们越做越多,突然就接近了Alpha测试,随后是在一些区域开放测试,接着就全球发布,如今迎来了数以百万计的用户量。

为了满足玩家预期,我们就必须推出更多内容,意味着做更多的英雄和皮肤,比如在Alpha期间,我们只有40个英雄而且没做皮肤,前不久的版本中,就已经有了68个英雄、189款皮肤,而且这个数字还在不断增长。

lazy.png

由于需要做更多内容,我们也需要更多人手,所以团队规模也快速增长。

不过,当我们只有10人研发小团队的时候,追踪特定资源是很容易的,并且可以通过交流提出不同的想法。然而,随着游戏团队越来越大,加上需要处理内部团队和外部团队协同,以往的方法很快就变得不可持续了。

为了展示具体问题,这是我与一个团队成员聊天遇到的问题:

lazy.png

同事问能否给他(九尾妖狐)阿狸模型,我需要确认是哪一个,当对方回答最新版之后,还要问他是游戏内模型还是turntable模型,然后再确定是哪个皮肤的对应模型。

lazy.png

即便到了这一步,我还是需要确认哪一个皮肤版本,比如2018年我们在PC版本发布了K/DA老版本,然后在2020年推出了面向双平台的新版本。通过这个例子,你们应该可以看到这个过程有多复杂。

lazy.png

更糟糕的是,随着疫情爆发,我们的研发还从办公室转向了居家办公。试想,从10人小团队在同一个办公室内面对面沟通,到社交隔离之后,你以往可以依赖团队成员协同快速解决问题,但疫情之后就只能孤军奋战,任何信息都需要通过线上工具和视频通话交流,这让你想要得到可靠的答案或者信息变得更难。

总结来说,我们遇到的问题有三个方面:复杂的资源层级结构、迅速增长的团队规模,以及居家办公导致的沟通难题。结果就是,原本简单的资源追踪都变成了很痛苦的事情。

寻找解决方案的目标与限制

我们需要一个工具,能够快速得到资源的广度和深度信息,广度方面比如我们现在有多少个英雄?目前版本有多少个辅助坦克?深度方面,烧烤女神皮肤大招需要的动画列表是什么?

局限在于,我们一个前提是,没办法重做工作流程,因为内容制作已经全力在做,如果重做很可能无法满足内容发布要求,这就意味着引入新流程“重做轮子”是不现实的。

发现

lazy.png

那么,我们现在需要知道什么?在哪里可以找到答案?这就让我们进入了发现阶段。

我们采取的第一个方法就是研究项目中现有的技术,这是很重要的一步,我需要知道我们已经或者在近期可能有什么技术,所以甚至需要做一些设想。我查询了大量的文档,并且与美术、工程师甚至是策划团队领导进行沟通,充分了解我们项目的美术资源是如何创作以及被使用的。

这个过程中,我发现一个重要的事情是,我们游戏里有一个内部游戏逻辑系统用来设置游戏里的每个英雄,比如在英雄释放技能期间使用哪个英雄动画?或者玩家使用某个英雄皮肤的时候加载哪一个模型?这个系统根据不同用途分布在不同地方,但这是没有关系的,我只需要知道从哪里找到它们。

lazy.png

比较好的消息是,这些系统都是用.json进行序列化的,意味着我不需要任何多余的工具就可以输出,因此在这种情况下,我们项目中定制化的工具帮我解决了首个重要的问题。

需要强调的是,这种小众化的工具刚开始通常是比较难以理解的,比如相关文档可能已经丢失,即使存在,也可能因为项目进展而显得过时。因此,当没有文档的时候,我就需要与团队甚至是具体的某个人进行核对,当文档和团队都没有的时候,我就不得不写代码,通过代码分析找到答案。

这是很困难的,但带来的帮助也很大,如果你能够降低研发工具的门槛,那么投入的努力就都是值得的,至少对我而言。

lazy.png

接下来是免费工具,我们使用了Unity资源系统,比如prefab系统和.meta文件,由于这些都是统一的,可以运用于所有的Unity项目,所以可以围绕它来打造工具。在一个Unity prefab文件里,它实际上存储了一个游戏对象,包含了它的所有的组件、属性值,甚至是其中的游戏子对象。它就像是一个表格,我们用它来配置《英雄联盟手游》里的很多资源,包括游戏里的英雄。

Meta文件用于存储独特的id或者是Unity一开始分配的id,这两个Unity功能在我做工具的时候带来了很大帮助,后续我会更详细说到。这些系统的优势在于,它们的相关知识都是向公众开放的,在官方文档以及社区论坛都可以找到资料,因此这些工具的学习门槛比之前提到的内部工具低很多。

lazy.png

我们的最后一个发现,是命名传统,你们可能听过无数次,我这里列举的都是资源相关的内容,它们的命名传统是非常重要的。我们将其分为两个类别,一类是文件夹、文件命名这样的系统资源,另一类是美术资源,比如套索、动画、特效。

比如套索,我们可能会以L/R/C等字母来表示它属于资源或者骨架的哪一侧,动画命名可能会有IN/OUT/TRANS,特效可能出现HIT/BUFF等字母来解释其用途。有了连贯且明显的命名传统,很多问题可以立即找到答案。

然而,我们必须知道的是,这样的效果很明显比较弱,如果团队有人不知道这些传统,没有按照这些格式命名,那很容易就会让人困惑。比较幸运的是,我们的团队在这方面做的不错,这些命名传统帮我解决了一部分问题。

解决方案:资源分析工具(aat)

lazy.png

我们的解决方案是一套资源分析工具,它可以用来解释英雄相关的所有资源数据,这种情况下,我们将英雄使用的所有json文件注入了之前提到的游戏逻辑系统。这些文件包括英雄的一些基本信息,比如英雄名字、攻击范围等,我们还可以知道它们的皮肤、技能名字,包括2D资源,更重要的是它们在我们项目里的路径。

lazy.png

有了这些信息,我们就可以用它来加载更细节的资源信息,比如网格、材质、动画、特效等等。

lazy.png

在这些数据基础上,工具会给每个资源类型创造容器(container)来展示我们之前提到过的资源层级视图,比如英雄层级、皮肤层级都有对应的资源,这让接下来的工作更简单、友好。

lazy.png

接下来是资源API,我们希望这个工具可以为所有人带来简单的数据切入点,他们只需要输入aat就可以简单操作。比如输入阿狸,就可以立即找到具体皮肤的资源,或者所有皮肤的资源,这就意味着数据可以通过有序的方式得到,而且很容易根据不同目的进行定制化,带来无尽的可能。

lazy.png

我们能够得到这样的结果,是因为很多的整合,你们可能已经知道,我们是用Python写的这个工具,所以我们首先做的是集成Unity Parser以及YAML这样的功能。这个案例中,Unity Parser是用来传递prefab,这样我就知道这个prefab包含了哪些内容,比如网格和材质,因此我们可以继续追踪这个prefab里的资源。

这时候我们就用到了YAML,它可以帮我们识别正在寻找的资源id,这样我们就可以注入或者加载对应资源,比如我们有很多的FBX文件用于模型和动画,我们将这些工具与FBX SDK进行集成,这不仅让资源追踪更便捷,甚至可以对特定资源进行QA。

lazy.png

你们可能会问,为什么用Python?既然是Unity引擎研发,为什么不用C#呢?后者似乎是更直接的选择,但在《英雄联盟手游》这样的游戏里,用Unity加载一个项目需要5-10分钟,所以我需要的是更轻、更快的工具,当我需要找到答案的时候,最讨厌的就是等待。

另外,我希望这个工具是独立的,也就是不希望它过于依赖我们项目的其他技术,比如我们运行这个工具甚至不必使用Unity引擎,而且大幅增加了迭代效率,让我们的工具研发效率更高。

lazy.png

这就是我们工具得到的结果,它可以让任何人快速得到准确的资源,而且可以根据特定需求进行定制化,并且对特定资源进行分析。

lazy.png

在我们一次视频会议中,有人问,“我们项目里的哪个英雄的多边形最高?”我直接写了一行简单的代码,对比了一些资源数据,就很快得出了结果:萨勒芬妮星籁歌姬(原皮)。设想我在Unity项目直接做这件事会是什么结果:首先需要等5分钟加载所有东西,随后还要通过C#脚本找到最高的模型,然后再用几分钟找到具体的答案。

lazy.png

所以,有了这个工具之后,我们可以用到任何格式中,比如CSV或者Excel文件,因为并不是团队所有人都能写Python脚本。不仅如此,我们还可以将工具与任何框架或者工具连接,比如Maya或者其他单独工具,我们还把这个工具用到了其它项目,甚至可以用到主机、PC游戏,几乎能覆盖Riot所有团队。

研发心得

了解你的游乐场

为了不重复造轮子,我学到的第一件事,就是了解你的游乐场。这里我提到的游乐场,指的是现有的数据和工具,在这样大的项目中,一定会有很多的数据,其中一些是很容易上手的,比如我们的json文件,还有些数据是不存在的,我们必须想办法填补空白。

lazy.png

另外,了解已有工具也是同样重要的,有些工具是定制化的,比如我们提到的游戏逻辑系统,还有些工具是通用的,比如Unity资源系统。得到了这些信息之后,它不仅可以让你掌握整体状况,还可以避免从头开始做重复的事情。

lazy.png

我们更愿意在已有的基础上打造工具,而不是从0开始,这种方式很明显是更快速、更有效率的。这种方法的不利在于,了解已有信息可能需要付出更多的沟通成本,但是从长期利益来看,这些都是值得的。

对的工具和前瞻性计划

lazy.png

第二个心得,就是选择对的工具并打造一个具有前瞻性的计划。

lazy.png

我们希望自己选择的工具是很容易做长期支持的,而不是一个5年内就可能过期的方案。我们还希望这个工具更灵活,可以在必要的时候做出调整,很容易运用到其他甚至是未来产品中。另外,我们还希望这个工具的依赖性很低,这样不需要太多的风险就可以继续迭代。

我们选择Python写这个工具是非常适合团队的,首先Riot团队已经有很多的Python用户,意味着学习门槛较低。与此同时,这还意味着在我们需要帮助的时候可以很容易得到支持,因此在技术和人员支持方面都比较容易做到,谈到支持,Python有官方支持还有很活跃的社区,这让我们更有信心。在我们没有开始做这个工具之前,就希望它的技术依赖性很低。

快速试错

lazy.png

最后一个心得,特别是对我来说最重要的是,一开始保持小规模,这样才能快速开始,也就是很多人提到的“fail fast”。在创意阶段,你可以很快向同事展示对应的结果,更早地发现问题。

lazy.png

通过这种方式,你可以将项目模块化,通过一些小组件的叠加得到更大的部分,你可以复用一些内容,甚至在必要的时候很容易拿掉不需要的模块。我非常相信,《英雄联盟手游》会有更大的潜力。

lazy.png

总的来说,对我而言,如果想要避免“重复造轮子”,最重要的是整合,你们可能在此之前听过很多次,我打造这个工具的方式就是合作精神,而且我觉得这比所有权更重要,这在《英雄联盟手游》很重要,我们与全球很多伙伴合作,只有这样才能给我们的玩家带来令人惊艳的手游体验。

作为技术美术,我们的职责就是将技术和艺术融合,实现更好的体验,协同合作比各扫门前雪更有趣,尤其是在我们都已经居家办公一年多的情况下,我鼓励所有人积极合作,如今短暂的社交隔离,不是我们停止协作的理由,相信我们很快就可以走出家门,再次到办公室一起合作,参加业内活动。

ANRLOL30.jpg

最后,1+1>2,我们在一起的时候更好,希望今天的分享给你们的工作、管线、游戏,甚至是团队、伙伴之间的工作关系带来帮助,让我们共同创造更有趣、更精彩、更好的游戏。

如若转载,请注明出处:http://www.gamelook.com.cn/2022/07/490194


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK