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

在本文中《斗罗大陆:魂师对决》的主创团队,将从技术的角度来谈一谈,如何复刻出最原汁原味的「斗罗大陆」!

三年前,三七游戏便确立了「精品化、多元化」的研发战略。负责《斗罗大陆:魂师对决》的研发工作是公司负责精品化游戏研发的团队,团队上下共约 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 亿次贴图。找一台好一点的机器,线程数全部用满的情况下检查全部贴图只需要半小时就可以得到结果。对于完全相同的贴图计算机会删掉多余的,修改相关材质和预设的引用然后一键提交。相似度高的贴图美术会酌情处理。这样美术完全不用关心贴图重复的问题,也不会因贴图放置的位置乱而头疼了。自然而然保证了项目中资源的整洁可控。

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

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

昼夜系统是「魂师对决」的一大特色。为了在手机上做到 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 以下。

游戏画质的提升,随之而来的的确是对性能的考验。团队把性能优化始终放在最高的位置。一款重 GPU 的游戏指令和变体的优化非常重要。之前提到过魂师对决的场景、模型都是用的基于物理的渲染,除此之外特效也有多种多样的表现。

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

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

想要了解更多关于Unity的最新消息与应用案例,请继续关注我们的账号。我们会在第一时间快速整理有关Unity的最新动态。欢迎大家关注转发~