首页 > Unity 技术在三七互娱《斗罗大陆》3D手游中的应用
头像
资讯速递
编辑于 2021-07-27 09:52
+ 关注

Unity 技术在三七互娱《斗罗大陆》3D手游中的应用


诺丁城、史莱克学院、星斗大森林、杀戮之都……改编自国民顶级 IP《斗罗大陆》的最新手游《斗罗大陆:魂师对决》于7月22日正式开启公测!




据悉,游戏的研发团队中不乏资深「斗罗迷」,如何创作一款让粉丝满意,也让自己骄傲的游戏作品是他们一贯的追求。在《斗罗大陆:魂师对决》中,玩家看到的不只是游戏角色,而是果断可靠的唐三、活泼开朗的小舞、嫉恶如仇的柳二龙、学识渊博的玉小刚,通过角色 CG、剧情动画、游戏场景等元素,复刻出一个个立体饱满的角色形象。


在游戏领域,目前市场上已有多款《斗罗大陆》改编的手游,但质量却参差不齐。据行业媒体游戏智库评测,这款游戏可能是截至目前最原汁原味的一款“《斗罗大陆》3D 手游”


本次 Unity 采访到了《斗罗大陆:魂师对决》的主创团队,邀请他们从技术的角度来谈一谈,如何复刻出最原汁原味的「斗罗大陆」!




先和大家打个招呼吧。


三七游戏:大家好,我们来自三七游戏。三年前,公司确立了「精品化、多元化」的研发战略。负责《斗罗大陆:魂师对决》的研发工作是公司负责精品化游戏研发的团队,团队上下共约 200 人。每个人在团队中都发挥着重要的作用,并且往往出现只为寻找解决问题的最佳方法,而不管团队成员的什么职位什么资历的情况。真正做到了团队上下一心,团队的最高宗旨就是做出更好的游戏。团队同学不少都是资深「斗罗迷」,对于斗罗世界的一切可谓了如指掌。


《斗罗大陆》是一个非常知名的 IP,我们可以看到过往有非常多的以此 IP 为基础影视作品及游戏产品。制作这类具有庞大粉丝群体的 IP 产品,会需要注意哪些细节呢?


系统

游戏的系统需要基于 IP 的设定,拿养成系统来说,我们采用了 IP 本身最核心的升级、突破、魂环、魂骨系统,拿战斗系统来说,我们支持上阵 8 个卡牌,因为无七怪,不斗罗,他们必须得可以同时上阵,此外,战斗中消耗魂力使用魂技,各个魂师的魂技都和原著有所对应。


玩法

斗罗的 IP 中,最重要的玩法就是狩猎魂兽,获取魂环魂骨,因此这也是我们贯穿始终的核心玩法,同时我们为了加强玩家获取魂环时的感受,在玩家战斗胜利后会播放一段魂兽死亡倒地,魂环从其身体往上飘的动画展示,让斗罗 IP 的玩家一看就知道,这感觉对了。


剧情

IP 类产品最重要也是最基础的一个点,就是剧情的还原,为了让玩家更好地体验我们的剧情,我们设定了玩家重走唐三的斗罗之路,从初见小舞到和其他史莱克的怪物互相扶持,一步一步直至成神,让玩家能够有一个最自然的体验剧情视角,在玩家的这些剧情中。


场景和人物

我们要做到「跟动漫一模一样」。场景包括渲染风格、标志性建筑、光影变化等;人物包括模型、动作、技能、特效、台词、配音等都必须忠于 IP,而且要抓重点。比如斗罗中有多个经典场景:花海的梦幻樱花,武魂殿的恢弘磅礴,嘉陵关的黄沙漫漫。决定了我们一定要强化场景中的 GI 效果和天气效果,要表现足够丰富的光影变幻。斗罗动漫中也有着丰富的特写镜头,赵无极的古铜色皮肤,朱竹清细腻的皮肤,长大后唯美的小舞都给动漫迷留下了深刻印象。我们会参考斗罗动漫的设计,很多斗罗迷也是动漫迷,玩家会不自觉地拿我们的人物和动漫的进行比较。而动漫也指引了我们的技术方向。




强大的编辑器往往可以简化游戏开发中的工作流程,在《斗罗大陆:魂师对决》的制作中,你们都制作了些什么编辑器呢?能够给我们简单介绍一下他们的功能与实现吗?


三七游戏:三七游戏有句「土话」,没有思路就没有出路。斗罗世界拥有复杂而华丽的技能表现,传统的技能制作方式效率上没有出路。我们开发了全新的技能编辑器。我们用 timeline 和 cinecamera 的组合,解决了所见即所得的痛点,美术在技能制作过程中就可以在不同小怪或 Boss 镜头下查看和编辑技能从释放到受击的全过程。它在 UI 交互方面做到了标准化、统一化,简单化。


技能编辑器不仅支持常规的动作动画控制,更可以控制大招场景的过渡、后处理的变换、多对象交互。美术能用简单的操作实现如武魂融合等协同表演、模块化特效元素、场景光影更替等天马行空的设计。




一款「好用」的编辑器看起来要足够简单,实则是 TA、美术、技术深度合作的产物,他既要能发挥各个部门最擅长的部分,又要能提高效率,还要满足技术指标。


美术喜欢使用更直接的交互:编辑单个预设、单个场景或者一段零散的表演。比如场景更换元素,美术编辑好大招场景。TA 处理好场景间光照环境变化、气候变化、后处理过度变化等。我们也支持了复制、撤销、多目标预览等操作提高产出效率。技术则需要改进 TimeLine 源码。Editor 侧需要支持 WWISE 音频资源、预设事件的拖拽、点击元素等自定义交互事件,Runtime 则需要打通资源加载底层。


我们对美术在技能中使用到的预设、场景、后处理等资源引用关系做了运行时自动拆分,这样技能释放时加载量能控制在 10KB 以下,也方便查看所有资源的依赖关系和定制缓存策略,同时可以保证运行时和编辑环境完全一致。而这些都不会影响到美术的制作。还有很重要的一点,技能播放过程中编辑器需要帮助美术统计 Overdraw,方便自查资源负载情况。


场景编辑器是所有项目中不可或缺的,它是项目成败的关键一环。「魂师对决」中的场景编辑器设计理念是强大、包容。而场景编辑器随着项目的成熟已经发展成了一个独立完整的插件——场景制作平台。强大指它要包含场景制作人员涉及到的所有工序,包容指它要能能容纳更多有创意的创新工具。


「魂师对决」的场景全部采用基于物理的光照模型,场景优化工作是重中之重。比如场景中的不透明物件如果产生 overdraw,其严重程度远远高于特效,会造成毁灭性的灾难。


为了充分利用移动端的 early-z,我们对场景中所有的材质队列有严格的规划,并且在相同的渲染队列区间根据不同变体错开排列。所有的背景物件我们都采用 gpuinstance 的方式绘制,对可行走区域一定距离的物件我们会关闭阴影相关变体,关闭 lightprobe、reflectionprobe。我们会合并多余的反射探针、对场景特效关闭间接光、阴影的接收。树叶采用自定义透光机制,关闭反射探针等。而这些优化措施对于美术是完全不感知的,一键优化提交。



Unity 的地形刷工具已经很强大了。但是手机游戏总会有他的限制。为了更好的适配多种机型,我们重写了 Unity 的地表刷系统。场景工作平台的地表刷功能继承了 Unity 的一笔多刷(刷颜色、刷湿度、刷明暗)功能方便美术使用。


另外我们在美术保存时增加了末位剔除功能。也就是我们会在美术使用的 16 张 Texture Array 中选取前 4 个占比最高的贴图。保证每个像素最多采样四次。大部分低端设备上最多只支持 4 张贴图采样,因此我们加入了贴图交换功能。美术刷完地图后可以把占比较高的贴图交换到前面。这样就能最大程度保证市面上所有机型的效果。


基于物理的渲染大家这两年都很熟悉了,使用 PBR 光照模型能制作出非常写实的效果。而「魂师对决」则不同,我们的口号是「和漫画一模一样」。因此场景工作平台需要支持我们所有的风格化参数的调整。从基础功能来说,它包含高光、反射、雾效、风格化天空盒、透光、树叶、主角光源等一系列参数。进一步来讲,它形成了昼夜变化、天气变化两个独立的模块。场景工作平台的昼夜变化和天气变化的目标就是用最小的代价做到实时 GI 的表现。


游戏中的寻路网格我想大家也有多种方案。场景工作平台在寻路网格的创建上有所突破。我们可以自动调整到和合适视角拍摄俯视图,根据 tag 生成一张图片。美术在 ps 中调整图片,就可以导出寻路网格了。根据俯视图生成的 mesh 我们采用了基于 GEM 的渐进式网格优化方法。可以自动生成足够简化的寻路网格。同时也降低了服务器寻路的压力。




场景制作平台提供了拍照工具,比如美术觉得一棵树好看,可以对树使用拍照功能。远景复杂的树木就变成了一颗难辨真假的面片。拍照功能支持单角度,多角度,自定义 mesh 烘焙等模式,应对各种复杂的远景表现。




众所周知在移动设备上 compute shader 的支持一般,但是在 PC 上却能大放异彩。每个团队一定都会为大量的重复、相似、屯余、大透明范围的贴图头疼。我想在很多人的想象中「魂师对决」这种大型项目的资源管理一定很复杂。实际上却很轻松。


我们为美术定制了专属资源优化工具。它可以对所有的美术贴图逐像素对比,然后找到完全相同的贴图,列出相似度较高的贴图、输出透明占比以及屯余的贴图。这些操作都是使用 compute shader 实现的


这里以特效为例,「魂师对决」的特效有 2 万 texture,相当于要对比 2 亿次贴图。找一台好一点的机器,线程数全部用满的情况下检查全部贴图只需要半小时就可以得到结果。完全相同的贴图我们会删掉多余的,修改相关材质和预设的引用然后一键提交。相似度高的贴图美术酌情处理。我们也很贴心的将重复的贴图或者美术没有按照目录结构放置的贴图拷贝到规定目录下。这样美术完全不用关心贴图重复的问题,也不会因贴图放置的位置乱而头疼了。自然而然保证了项目中资源的整洁可控。



工具永远是为了提高生产力的,「魂师对决」对工具的产出极为重视,最终也取得了很好的结果。


我们注意到《斗罗大陆:魂师对决》的画质比起以往的其他游戏有了一个质的飞跃,对于渲染你们都做了什么改进与优化呢?Unity团队在你们做自我突破过程中是否有给你们提供到一些帮助呢?能不能给我们介绍一下?


三七游戏:尽管早有心理准备,但游戏开发难度还是远超我们想象。况且有斗罗大陆 3D 动画珠玉在前,大家对斗罗手游的画面自然很难将就。所以,游戏的「颜值」——美术品质至关重要。


在斗罗大陆中有众多的森林场景。花草便是很重要的一环。我们研究了多种做法和光照模型。现在比较流行的模型加顶点色做草的方式难以表达复杂的花草效果。我们选择了 alpha test 的方式来做,接下来我们遇到的问题就是光照模型的选择。面对大面积的草,一般只能选择 lambert、blinnphone 这种简单模型。但是单独使用,无法和我们 PBR 的场景融合。我们尝试将 GGX 高光烘焙到顶点或者在顶点计算高光,效果基本达到了但是性能又满足不了要求。最终我们采用了双层高光方案:一层较弱的改进版 blinnphone 高光来模拟反射效果,一层透光模型来做场景融合。最终达到了预期。在制作草的过程中,感谢 Unity TA 专家和我们一起做了诸多研究和尝试。直到上线前我们都还在对草做改进。



昼夜系统是「魂师对决」的一大特色。我们为了在手机上做到 24 小时变换效果做出了诸多努力。先来说说雾,美术希望能在相同的场景,不同时间段能用雾表达出完全不同的氛围。我们的场景统一使用了指数高度雾。它相对于深度雾第一个重大的优势就是越远的地方雾上升的越高。这样当玩家在比较浅的雾效区域看远景也会有非常理想的雾效。指数高度雾第二大特点是参数好调节。密度、偏移和开始距离就能很好的表述它的特性。最后把色散融入了雾效,氛围感就比较好了。



我们希望在昼夜的变化中保留完整的实时光和环境光。我们烘焙了多套 lightmap 和多套 lightprobe,这样在不同的时间物件会有很好的光照过度。现在移动设备上比较好的烘焙方案是 shadowmask。而 shadowmask 这张图刚好可以合并另一时段的 lightmap 颜色贴图。也就是对 lightmap 的差值除了差值算法本身基本不带来额外的消耗,这样所有配置的机器都能有良好的性能表现。不过想要完美使用多套间接光过度,还是要对 Unity 源码进行修改才可以。


Unity 的烘焙器对相同的物体的 uv2 在 lightmap 中的排布是随机的。这会导致不同时间段的表现异常。这里我们修改了烘焙器源码,对相同物件在烘焙时 uv2 在 lightmap 中的排布有完全一致的排序规则。在使用 lightprobe 差值的时候会发现无论是采集两套 lightprobe 还是 SphericalHarmonicsL2 的差值都会造成巨大的消耗。我们将 lightprobe 的计算全部挪到了 C++ 层,实测下来 CPU 时间可以降低到 1/20



斗罗大陆的场景环境极为多变,宏大的场景中难免会有大面积的阴影区域。引擎中阴影区域的光照主要来自于环境光。太写实的环境光并不适合我们。斗罗的最终采用了 directinal 的烘焙方式。为了在间接光中产生真实的光照表现,我们参考了 2018 GDC 上寒霜引擎的 GI 数据存储方式。我们用 LightProbe 球偕的方向代替 4 个映射的方向与 Unity Directional 贴图方向加权平均再计算 GGX 高光,也就时间接高光越强的地方 SH 高光占比越高。好在方向图不需要很高的精度,我们把多张方向图放在了同一张贴图中。玩家也会受到 SH 高光的影响。



有了这些,基本的昼夜效果已经很丰富了。后面的云、星星、银河、月亮等顺其自然也成了必需品,我们都融入到了天空材质中。基于物理的天空盒在太阳靠近地平线时会有很好的容积光效果,但是光谱计算对于美术理解不是很友好,我们在天空流明度的计算中加入了颜色参数方便美术调整不同时间的风格化表现。移动端的昼夜做起来实属不易,美术为我们的每个场景制作了 7 个不同时间段的表现才有了我们现在看到的昼夜变换。希望能为每一个斗罗粉丝都带来极致的昼夜体验。




天气系统是另一个较为庞大的系统。得益于昼夜系统对 GI 的熟练控制,不同天气的环境氛围在斗罗中很容易被表达出来。重点反而在独特天气的表现,比如雨水、风场等。在雨天的制作中我们在 hudini 中下了一场大雨,记录下地表的水纹表现。通过对比多种下雨效果发现横向的雨水流动能非常好的描述真实的下雨场景,导出雨点和水平方向的法线在游戏中可以实现逼真的下雨效果。


「魂师对决」的皮肤渲染模拟了表皮层和真皮层。实现了可分离的次表面散射效果。真皮层负责对次表面散射的实现,表皮层主要参考了 HDRP 中皮肤的实现,负责对散射后的光线进行模糊处理。皮肤的卷积计算并不适合在手机上使用。我们在 HDRP 中调整卷积核,找到最适合斗罗大陆的参数应用到项目中。


为了解决斗罗世界皮肤差异巨大的问题,我们把屏幕空间的运算改良到了 Command Buffer 中,这样每个角色都能有不同的散射效果。配合皮肤表现我们根据美术的骨骼结构自研了头部骨骼的 IK 解算。无论美术给我们的角色凹了什么造型,我们都可以正确解算头部、颈部、眼睛、肩膀、腰部等骨骼,表现自然的注视效果。体积云、体积光、水面都可以提升场景氛围,我们在绘制水时使用了 Ray-Matching 技术。Ray-Matching效果固然好,不过求交计算会带来 10ms  以上的 GPU 耗时。想要有比较好的性能表现,我们采用了指数步进法,求交时间可以控制到 3ms 以下。



高品质的渲染往往都意味着在性能优化上面临更大的考验,你们都做了哪些优化去克服这些挑战呢?我们 Unity 也有 UPR 与企业支持的 PR 服务,在你们实际优化中我们这些服务是否有给你们提供到什么帮助呢?能不能给我们简单说说?


三七游戏:游戏画质的提升,随之而来的的确是对性能的考验。团队把性能优化始终放在最高的位置。从立项开始,每个功能我们都在持续寻找性能更好的方案。一款重 GPU 的游戏指令和变体的优化非常重要。之前提到过魂师对决的场景、模型都是用的基于物理的渲染,除此之外特效也有多种多样的表现。


一般优化 shader 的步骤是对变体进行变量归属和精度修正,然后剔除变体相关的计算,再根据手机 GPU 架构优化 cycles 数量。我们实现了全自动的指令优化工具。拿树叶举例,全屏是树叶的情况下,渲染耗时能降低 50%。特效使用这套工具也可以减少所有美术没有用到的采样器和对应的计算指令,全部特效跑完指令优化工具后 CPU 温度降低了 2-4 度。耗电量同时大幅下降。




回合制游戏的另一大优化痛点是切换地图。我们把场景资源分割成了物件、植被、贴图、剧情、特效、地表几大块。在开发阶段测试时我们会持续统计所有资源的加载顺序、卸载时机。根据玩家当前的设备、等级、养成和位置决定加载和缓存策略。最终大部分情况可以做到 1s 切图的效果


全部评论

(2) 回帖
加载中...
话题 回帖

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

热门推荐