三七研发,这款被称作“目前最原汁原味的”《斗罗大陆》3D手游都用到了哪些Unity技术?

2021/07/23767 浏览综合
诺丁城、史莱克学院、星斗大森林、杀戮之都……改编自国民顶级 IP《斗罗大陆》的最新手游《斗罗大陆:魂师对决》于昨日正式开启公测!
TapTap
据悉,游戏的研发团队中不乏资深「斗罗迷」,如何创作一款让粉丝满意,也让自己骄傲的游戏作品是他们一贯的追求。在《斗罗大陆:魂师对决》中,玩家看到的不只是游戏角色,而是果断可靠的唐三、活泼开朗的小舞、嫉恶如仇的柳二龙、学识渊博的玉小刚,通过角色CG、剧情动画、游戏场景等元素,复刻出一个个立体饱满的角色形象。
在游戏领域,目前市场上已有多款《斗罗大陆》改编的手游,但质量却参差不齐。据行业媒体游戏智库评测,这款游戏可能是截至目前最原汁原味的一款“《斗罗大陆》3D手游”。
本次 Unity 采访到了《斗罗大陆:魂师对决》的主创团队,邀请他们从技术的角度来谈一谈,如何复刻出最原汁原味的「斗罗大陆」!
大家好,我们来自三七游戏。三年前,公司确立了「精品化、多元化」的研发战略。负责《斗罗大陆:魂师对决》的研发工作是公司负责精品化游戏研发的团队,团队上下共约200人。每个人在团队中都发挥着重要的作用,并且往往出现只为寻找解决问题的最佳方法,而不管团队成员的什么职位什么资历的情况。真正做到了团队上下一心,团队的最高宗旨就是做出更好的游戏。团队同学不少都是资深「斗罗迷」,对于斗罗世界的一切可谓了如指掌。
1. 系统:游戏的系统需要基于IP的设定,拿养成系统来说,我们采用了IP本身最核心的的升级、突破、魂环、魂骨系统,拿战斗系统来说,我们支持上阵8个卡牌,因为无七怪,不斗罗,他们必须得可以同时上阵,此外,战斗中消耗魂力使用魂技,各个魂师的魂技都和原著有所对应。
2.玩法:斗罗的IP中,最重要的玩法就是狩猎魂兽,获取魂环魂骨,因此这也是我们贯穿始终的核心玩法,同时我们为了加强玩家获取魂环时的感受,在玩家战斗胜利后会播放一段魂兽死亡倒地,魂环从其身体往上飘的动画展示,让斗罗IP的玩家一看就知道,这感觉对了。
3.剧情:IP类产品最重要也是最基础的一个点,就是剧情的还原,为了让玩家更好地体验我们的剧情,我们设定了玩家重走唐三走过的斗罗之路,从初见小舞到和其他史莱克的怪物互相扶持,一步一步直至成神,让玩家能够有一个最自然的体验剧情视角,在玩家的这些剧情中。
4.场景和人物:我们要做到「跟动漫一模一样」。场景包括渲染风格、标志性建筑、光影变化等;人物包括模型、动作、技能、特效、台词、配音等都必须忠于IP,而且要抓重点。比如斗罗中有多个经典场景:花海的梦幻樱花,武魂殿的恢弘磅礴,嘉陵关的黄沙漫漫。决定了我们一定要强化场景中的GI效果和天气效果,要表现足够丰富的光影变幻。斗罗动漫中也有着丰富的特写镜头,赵无极的古铜色皮肤,朱竹清细腻的皮肤,长大后唯美的小舞都给动漫迷留下了深刻印象。我们会参考斗罗动漫的设计,很多斗罗迷也是动漫迷,玩家会不自觉地拿我们的人物和动漫的进行比较。而动漫也指引了我们的技术方向。
TapTap
三七游戏有句「土话」,没有思路就没有出路。斗罗世界拥有复杂而华丽的技能表现,传统的技能制作方式效率上没有出路。我们开发了全新的技能编辑器。我们用timeline和cinecamera的组合,解决了所见即所得的痛点,美术在技能制作过程中就可以在不同小怪或Boss镜头下查看和编辑技能从释放到受击的全过程。它在UI交互方面做到了标准化、统一化,简单化。技能编辑器不仅支持常规的动作动画控制,更可以控制大招场景的过渡、后处理的变换、多对象交互。美术能用简单的操作实现如武魂融合等协同表演、模块化特效元素、场景光影更替等天马行空的设计。
TapTap
一款「好用」的编辑器看起来要足够简单。实则是TA、美术、技术深度合作的产物,他既要能发挥各个部门最擅长的部分,又要能提高效率,还要满足技术指标。美术喜欢使用更直接的交互:编辑单个预设、单个场景或者一段零散的表演。比如场景更换元素,美术编辑好大招场景,TA处理好场景间光照环境变化、气候变化、后处理过度变化等。我们也支持了复制、撤销、多目标预览等操作提高产出效率。技术则需要改进TimeLine源码。Editor侧需要支持WWISE音频资源、预设事件的拖拽、点击元素等自定义交互事件,Runtime则需要打通资源加载底层。我们对美术在技能中使用到的预设、场景、后处理等资源引用关系做了运行时自动拆分,这样技能释放时加载量能控制在10KB以下,也方便查看所有资源的依赖关系和定制缓存策略,同时可以保证运行时和编辑环境完全一致。而这些都不会影响到美术的制作。还有很重要的一点,技能播放过程中编辑器需要帮助美术统计Overdraw,方便自查资源负载情况。
场景编辑器是所有项目中不可或缺的,它是项目成败的关键一环。「魂师对决」中的场景编辑器设计理念是强大、包容。而场景编辑器随着项目的成熟已经发展成了一个独立完整的插件——场景制作平台。强大指它要包含场景制作人员涉及到的所有工序,包容指它要能能容纳更多有创意的创新工具。
图3
「魂师对决」的场景全部采用基于物理的光照模型,场景优化工作是重中之重。比如场景中的不透明物件如果产生overdraw,其严重程度远远高于特效,会造成毁灭性的灾难。为了充分利用移动端的early-z,我们对场景中所有的材质队列有严格的规划,并且在相同的渲染队列区间根据不同变体错开排列。所有的背景物件我们都采用gpuinstance的方式绘制,对可行走区域一定距离的物件我们会关闭阴影相关变体,关闭lightprobe、reflectionprobe。我们会合并多余的反射探针、对场景特效关闭间接光、阴影的接收。树叶采用自定义透光机制,关闭反射探针等。而这些优化措施对于美术是完全不感知的,一键优化提交。
TapTap
TapTap
Unity的地形刷工具已经很强大了。但是手机游戏总会有他的限制。为了更好的适配多种机型,我们重写了Unity的地表刷系统。场景工作平台的地表刷功能继承了Unity的一笔多刷(刷颜色、刷湿度、刷明暗)功能方便美术使用。另外我们在美术保存时增加了末位剔除功能。也就是我们会在美术使用的16张Texture Array中选取前四个占比最高的贴图。保证每个像素最多采样四次。大部分低端设备上最多只支持4张贴图采样,因此我们加入了贴图交换功能。美术刷完地图后可以把占比较高的贴图交换到前面。这样就能最大程度保证市面上所有机型的效果。
基于物理的渲染大家这两年都很熟悉了,使用PBR光照模型能制作出非常写实的效果。而「魂师对决」则不同,我们的口号是「和漫画一模一样」。因此场景工作平台需要支持我们所有的风格化参数的调整。从基础功能来说,它包含高光、反射、雾效、风格化天空盒、透光、树叶、主角光源等一系列参数。进一步来讲,它形成了昼夜变化、天气变化两个独立的模块。场景工作平台的昼夜变化和天气变化的目标就是用最小的代价做到实时GI的表现。
游戏中的寻路网格我想大家也有多种方案。场景工作平台在寻路网格的创建上有所突破。我们可以自动调整到和合适视角拍摄俯视图,根据tag生成一张图片。美术在ps中调整图片。就可以导出寻路网格了。根据俯视图生成的mesh我们采用了基于GEM的渐进式网格优化方法。可以自动生成足够简化的寻路网格。同时也降低了服务器寻路的压力。
TapTap
场景制作平台提供了拍照工具。比如美术觉得一棵树好看,可以对树使用拍照功能。远景复杂的树木就变成了一颗难辨真假的面片。拍照功能支持单角度,多角度,自定义mesh烘焙等模式,应对各种复杂的远景表现。
TapTap
众所周知在移动设别上compute shader的支持一般,但是在PC上却能大放异彩。每个团队一定都会为大量的重复、相似、屯余、大透明范围的贴图头疼。我想在很多人的想象中「魂师对决」这种大型项目的资源管理一定很复杂。实际上却很轻松。我们为美术定制了专属资源优化工具。它可以对所有的美术贴图逐像素对比,然后找到完全相同的贴图,列出相似度较高的贴图、输出透明占比以及屯余的贴图。这些操作都是使用compute shader实现的。这里以特效为例,「魂师对决」的特效有2万texture,相当于要对比2亿次贴图。找一台好一点的机器,线程数全部用满的情况下检查全部贴图只需要半小时就可以得到结果。完全相同的贴图我们会删掉多余的,修改相关材质和预设的引用然后一键提交。相似度高的贴图美术酌情处理。我们也很贴 心的将重复的贴图或者美术没有按照目录结构放置的贴图拷贝到规定目录下。这样美术完全不用关心贴图重复的问题,也不会因贴图放置的位置乱而头疼了。自然而然保证了项目中资源的整洁可控。
TapTap
TapTap
工具永远是为了提高生产力的,「魂师对决」对工具的产出极为重视,最终也取得了很好的结果。
尽管早有心理准备,但游戏开发难度还是远超我们想象。况且有斗罗大陆3D动画珠玉在前,大家对斗罗手游的画面自然很难将就。所以,游戏的「颜值」——美术品质至关重要。
在斗罗大陆中有众多的森林场景。花草便是很重要的一环。我们研究了多种做法和光照模型。现在比较流行的模型加顶点色做草的方式难以表达复杂的花草效果。我们选择了alpha test的方式来做。接下来我们遇到的问题就是光照模型的选择。面对大面积的草,一般只能选择lambert、blinnphone这种简单模型。但是单独使用,无法和我们PBR的场景融合。我们尝试将GGX高光烘焙到顶点或者在顶点计算高光,效果基本达到了但是性能又满足不了要求。最终我们采用了双层高光方案:一层较弱的改进版blinnphone高光来模拟反射效果,一层透光模型来做场景融合。最终达到了预期。在制作草的过程中,感谢Unity TA专家和我们一起做了诸多研究和尝试。直到上线前我们都还在对草做改进。
TapTap
昼夜系统是「魂师对决」的一大特色。我们为了在手机上做到24小时变换效果做出了诸多努力。先来说说雾。美术希望能在相同的场景,不同时间段能用雾表达出完全不同的氛围。我们的场景统一使用了指数高度雾。它相对于深度雾第一个重大的优势就是越远的地方雾上升的越高。这样当玩家在比较浅的雾效区域看远景也会有非常理想的雾效。指数高度雾第二大特点是参数好调节。密度、偏移和开始距离就能很好的表述它的特性。最后把色散融入了雾效,氛围感就比较好了。
TapTap
我们希望在昼夜的变化中保留完整的实时光和环境光。我们烘焙了多套lightmap和多套lightprobe。这样在不同的时间物件会有很好的光照过度。现在移动设备上比较好的烘焙方案是shadowmask。而shadowmask这张图刚好可以合并另一时段的lightmap颜色贴图。也就是对lightmap的差值除了差值算法本身基本不带来额外的消耗,这样所有配置的机器都能有良好的性能表现。不过想要完美使用多套间接光过度,还是要对unity源码进行修改才可以。unity的烘焙器对相同的物体的uv2在lightmap中的排布是随机的。这会导致不同时间段的表现异常。这里我们修改了烘焙器源码,对相同物件在烘焙时uv2在lightmap中的排布有完全一致的排序规则。在使用lightprobe差值的时候会发现无论是采集两套lightprobe还是SphericalHarmonicsL2的差值都会造成巨大的消耗。我们将lightprobe的计算全部挪到了C++层,实测下来CPU时间可以降低到1/20。
TapTap
斗罗大陆的场景环境极为多变,宏大的场景中难免会有大面积的阴影区域。引擎中阴影区域的光照主要来自于环境光。太写实的环境光并不适合我们。斗罗的最终采用了directinal的烘焙方式。为了在间接光中产生真实的光照表现,我们参考了2018 GDC上寒霜引擎的GI数据存储方式。我们用LightProbe 球偕的方向代替4个映射的方向与Unity Directional贴图方向加权平均再计算GGX高光,也就时间接高光越强的地方SH高光占比越高。好在方向图不需要很高的精度,我们把多张方向图放在了同一张贴图中。玩家也会受到SH高光的影响。
TapTap
有了这些,基本的昼夜效果已经很丰富了。后面的云、星星、银河、月亮等顺其自然也成了必需品,我们都融入到了天空材质中。基于物理的天空盒在太阳靠近地平线时会有很好的容积光效果,但是光谱计算对于美术理解不是很友好,我们在天空流明度的计算中加入了颜色参数方便美术调整不同时间的风格化表现。移动端的昼夜做起来实属不易,美术为我们的每个场景制作了7个不同时间段的表现才有了我们现在看到的昼夜变换。希望能为每一个斗罗粉丝都带来极致的昼夜体验。
TapTap
天气系统是另一个较为庞大的系统。得益于昼夜系统对GI的熟练控制,不同天气的环境氛围在斗罗中很容易被表达出来。重点反而在独特天气的表现,比如雨水、风场等。在雨天的制作中我们在hudini中下了一场大雨,记录下地表的水纹表现。通过对比多种下雨效果发现横向的雨水流动能非常好的描述真实的下雨场景。导出雨点和水平方向的法线在游戏中可以实现逼真的下雨效果。
TapTap
「魂师对决」的皮肤渲染模拟了表皮层和真皮层。实现了可分离的次表面散射效果。真皮层负责对次表面散射的实现,表皮层主要参考了HDRP中皮肤的实现,负责对散射后的光线进行模糊处理。皮肤的卷积计算并不适合在手机上使用。我们在hdrp中调整卷积核,找到最适合斗罗大陆的参数应用到项目中。为了解决斗罗世界皮肤差一巨大的问题,我们把屏幕空间的运算改良到了Command Buffer中,这样每个角色都能有不同的散射效果。配合皮肤表现我们根据美术的骨骼结构自研了头部骨骼的IK解算。无论美术给我们的角色凹了什么造型,我们都可以正确解算头部、颈部、眼睛、肩膀、腰部等骨骼,表现自然的注视效果。 体积云、体积光、水面都可以提升场景氛围。我们在绘制水时使用了Ray-Matching技术。Ray-Matching效果固然好,不过求交计算会带来10ms 以上的GPU耗时。想要有比较好的性能表现,我们采用了指数步进法,求交时间可以控制到3ms以下。
TapTap
TapTap
游戏画质的提升,随之而来的的确是对性能的考验。团队把性能优化始终放在最高的位置。从立项开始,每个功能我们都在持续寻找性能更好的方案。一款重GPU的游戏指令和变体的优化非常重要。之前提到过魂师对决的场景、模型都是用的基于物理的渲染,除此之外特效也有多种多样的表现。一般优化shader的步骤是对变体进行变量归属和精度修正,然后剔除变体相关的计算,再根据手机GPU架构优化cycles数量。我们实现了全自动的指令优化工具。拿树叶举例,全屏是树叶的情况下,渲染耗时能降低50%。特效使用这套工具也可以减少所有美术没有用到的采样器和对应的计算指令,全部特效跑完指令优化工具后CPU温度降低了2-4度。耗电量同时大幅下降。
TapTap
TapTap
回合制游戏的另一大优化痛点是切换地图。我们把场景资源分割成了物件、植被、贴图、剧情、特效、地表几大块。在开发阶段测试时我们会持续统计所有资源的加载顺序、卸载时机。根据玩家当前的设备、等级、养成和位置决定加载和缓存策略。最终大部分情况可以做到1s切图的效果。
TapTap
Unity中加载速度最快,消耗内存最小的资源压缩方案是LZ4的方式。LZ4基于Chunk压缩和解压,加载完成后不需要缓存AssetBundle。而且还可以加载Streaming Asset下的资源,极致的加载体验离不开它。但是他也有一个致命的缺点,就是想用到LZ4的所有优点包体中的资源就无法加密。必须的拷贝到可读写目录而且要先加载全部的ab再进行解密操作。这里我们采用了Unity定制的 AssetBundle的加密方案。可以省去包里资源的拷贝操作,提高资源安全性。经过测试额外只带来了微秒级别的CPU消耗。
更为复杂的问题需要更加科学的方法。「魂师对决」的全期开发过程中都使用了UPR工具。相对手动查询性能热点,它可以更为整体的辅助我们分析历史版本中CPU、GPU、带宽、Cylcles数、耗电量的变化。我们能通过它更及时发现性能问题和我们优化手段的反馈。同时也感谢Unity 的PR团队从源码的角度给我们提出优化建议。在我们的共同努力下,「魂师对决」技术产品力达到了新的高度。
3
1