丁成佳,tipsworks总监:Pascal合同的履行与优化

2020-12-23 16:19:26

威狐小编:11月16-20日,中国unity在线技术大会以直播的形式举行,为广大开发者带来了一场关于前沿技术和优秀案例的在线盛宴。在11月18日晚间的游戏环节中,Tipsworks《帕斯卡契约》项目总监兼美术总监郑成甲向开发者们详细拆解分享了《帕斯卡契约》开发过程中使用的技术以及游戏表现和优化方法。

《帕斯卡契约》是蒂普斯工场开发的首款游戏道具,在采取类似本体游戏的买手模式的同时,游戏的表现方式和呈现的最终品质都非常优秀,更像是3a大作。这款让苹果眼前一亮的游戏作为苹果强大的a13仿生处理器演示游戏出现在苹果2019秋季发布会上,成为首个登上史蒂夫乔布斯剧院的韩国人。

前不久《帕斯卡契约》销量突破100万套,成为今年首款销量破百万的国产单机游戏。在本次开发者大会上,郑成甲就游戏的画面表现、世界观剧情以及关卡设计方面进行了讲解,让国内很多同行都有思考。

以下为演讲实录:

郑成甲:您好。我是《帕斯卡契约》的总导演兼美术总监。我负责整个项目的框架、游戏和艺术表现。本次分享会上,我们将从游戏制作的角度来介绍《帕斯卡契约》的创作过程。下面就带大家看看在《帕斯卡契约》的创作过程中,我们经历了哪些阶段。最后我举几个例子来解析游戏中的美术表现和优化。

说到Pascal合约,先说一下我们的项目,最早的时候是使用unity创建的动作角色扮演项目。最初我们使用的是Unity5.6版本,最后一年我们升级到了Unity2018。

从2016年开始研发,大概三年的研发周期,制作人员从第一年的10个人一点点增加,到最后一年的30个人,整个项目资源的95%都是自产的。这就是我们公司的墙。早期,我们在墙上做了很多尝试。其实我们早期没有太多的方向,所以当时做了非常多的风格尝试。

接着我出了这样的小稿,这是一组黑暗中世纪题材的概念图。出了稿子以后,工作室里的每一个人看了稿子后觉得非常有兴趣,大家出乎意料的一致,觉得方向可以试一试。

确定了目标后,我继续做了一些人设的细化,就有了现在这张图,有剑士、女巫、贵族、猎魔人、重甲骑士这种风格。因为我们当时只有10个人左右的人力,决定把体量控制的小一点,我们商量了一下,做一款中世纪题材的动作对战游戏,可能是一个比较保险的方案。

到了项目开始定初期目标,这阶段我们觉得订立的目标始终要量力而为,订立可实际完成的体量,订立可实现的玩法,而不是说我脑子里有非常多、非常决战的点子,但实际制作的时候处处碰壁,结果只能完成它的60%或者70%。

所以我们考虑了很多,希望把制作体量控制在一个可掌控的范围之内,这是我们当时做的初期联机对战demo。

10个人花了一年,做了一个已经可以刷到手机上的联机对战模式,可以WiFi联机,就像《荣耀战魂》一样能够实现PVP,但是当时游戏性和画面都没有调的很好,游戏内容略微有点单薄,所以我们决定加入一些PVE元素。这是接下来为?PVE模式制作的一张场景设定,看起来有点诡异而破败的村庄。为此我们开始思考游戏的世界观和简单的故事。

当时我们做了一个所谓基地的PVE玩法,怪物不断从远方涌过来,玩家保护基地,需要不断的击杀怪物获得能量,然后用能量强化自身,迎接下一波怪物。这个PVE玩法现在看起来非常简单,但是对于当时的我们来说意义非常重大,因为时候我们终于得到了一个像样的游戏框架,而且玩起来确实也蛮有趣,给了我们前期非常大的信心,我们看到这一步后,想想还不如把这块好好做一做。

有幸的是场景最后被保存下来,就是这个场景。

这个场景现在是游戏最终上线后,第一关海格姆的画面,保留了原来那块区域,在这个基础上继续扩展了场景。这个时候我们目标比较明确,项目正式开始推动,就像雪球一样越滚越大。

关于世界观的包装,我们有一些自己的想法,特别是做一款手游,当游戏受到了体量的限制,我们不能去做地图很大的这种游戏,就不可能让玩家随心所欲地去任何地方,玩家一定会想为什么我去不了对面那座山,我过不了对面那个河,这时候我们一定要给玩家一个合理的解释,让玩家觉得这是一个合理存在的世界。所以我们在项目上的做法,是在世界上加了一个设定,比如这个世界失去了光明,只有在有光的地方才是人类正常可以活动的区域。

那么世界就需要一种发光体,可以让故事、剧情、整个世界聚焦,非常自然。我就设计了上面的生物,它为世界带来光明,人们依附他而活,形成了这个世界观。

所以当时我们决定需要一个与世隔绝被黑雾笼罩的世界。那这里生活人们的故事以及发掘这背后的秘密自然就成了剧情核心。我们创建的场景就会是生活在世界里人们的生态环境,同时也需要完整的故事链。主线剧情、主要的人物一点一点的添加进来。世界观的设定不断完善,在整个世界观里面不断回滚,关卡设计也在不断更新。最后我们得到了我们想要的故事体系和世界观。

当世界观设定好以后,我希望世界中的一切体系,一些系统,包括玩法系统都是服务于世界观的。所以设计了理智系统,这是一个绝望失控的世界,每个人都有可能在崩溃的边缘,主角当然也不例外。他看见疯狂的事情,这些疯狂会燃烧进他的理智,他可能时时刻刻都处在理性和非理性的边缘。

在混乱的世界中,当理智崩溃时要遇到什么,是看见灵异的怪物,还是看到发狂的boss,还是看到背叛的队友,这些都是通过游戏的理智系统所表现出来。但还是在一个统一的世界观之下,所以这是一个完整的包装,不是把玩法、美术,、剧情全部拆开来处理。我们希望无时无刻的提醒玩家,你正处在一个疯狂的世界中。

当时我们有意考虑到我们就这么点人力,但还要想办法节省资源和减少工作量。所以我们做的世界观设定,是外面的世界都处在黑雾中,整个游戏都处在浓雾中,而且光源很微弱,看不清远处,所以游戏的视距就不用开的很高,不用制作一些非常繁琐的细节,也让我们制作的实际体量确实小了很多,关于这块我会在后面场景制作的环节里具体分析,

这是我们的主角团,以及动态状态。

在做最开始的角色设计时,其实考虑过很多,比如手机屏幕比较小,人物占比较少,所以在设计的时候会把比例稍微做的夸张一点,物件的厚度都做得比较敦实,没有特别细小的设计,基本上以体块为主,哪怕东西缩小了,在屏幕上并不是很大,还是能感受到它的体积感和体块感。

这几张图基本是角色的制作流程。

原画到高模,再到材质的绘制。材质绘制流程上,我们基本上用painter来对材质进行写实绘制,基本上用PBR的这套基本流程,手机内存非常宝贵的话,贴图使用有限,我们主要把重点放在了材质的调节上,在游戏引擎里面在用unity还原出来实际效果。在做的时候基本上是全尺寸贴图,会最终会根据游戏的内存来进行优化。

基本上贴图不会专门去弄、去压缩,像diffuse和specular可能会看情况进行一些压缩,主要看内存的盈余。我们深入的研究了unity?standard的标准材质,而且Substance?Painter和unity也做了非常好的衔接,几乎一导出就可以针对unity5当时的标准材质输出。

最终我们用到的贴图有三种,diffuse?Specular以及Normel。金属度或是粗糙度,基本上是在阿尔法通道里去调整,整体来说用的是比较省资源的做法。

这是另一个角色,贝妮塔,这个角色它的特色是攻击别人的时候,同时可以吸收别人的生命,存在身上的血瓶里,血瓶会根据它自身的攻击,或对自身的回血上下浮动变化。

针对血瓶,我们是用Shader graph来实现效果,并且随着人物的位移,可以看到液体在里面晃动,基本上可以保持水平面的移动。当然这只是一半,最终实际效果要比这个好一点。

这是游戏中的小怪,主角团和boss我们基本上使用了PBR的流程。

但是因为主角或?boss都是相对单数出现,所以每个角色的材质球的数量控制可以控制的比较准,我们大概做了3~4个,分为武器、服装、头发和皮肤这几个材质球。普通的怪物,作为一款ACT游戏,可能会复数,一个场景里出现很多,所以用的材质相对比较简单。

虽然用的比较简单,但与boss是一个生产流程,用Substance?Painter来导出。只不过用的是比较传统的材质球,它的一些反射度基本上用的是一些反射环境球来模拟。

这是一个boss,游戏里会有很多这种非人性boss,给动作确实添了很多麻烦,这个角色有300多根骨骼,但在战斗场景里只有主角和boss,所以也是能消耗得起,而且大型 boss战我们使用的都是骨骼碰撞,会根据打击点的部位做出IK的收集反馈,甚至还有一些,比如这个boss的沙漏是一个弱点收集判断,而小怪基本上使用的是胶囊体碰撞,所以在一个场景里,单个怪和很多很多怪,中间要做取舍。

场景制作,这里我会举一个具体的例子,游戏中阿达米亚的场景,来解析它的制作流程。

从制作思路上来说,第一关结尾的时候,刚刚向玩家展现出了世界观,玩家知道头顶的大月亮其实是游戏里的巨像,正对着你。

那这一关就希望非常明确的让玩家知道这是什么样的世界,所以这一关的主题就是要玩家始终能看到巨像,在整个游玩过程中,希望达到的效果是,游玩过程中可以看到这个大家伙一直在你身边行走。

大概确立了剧本以后,首先我会先出这样的概念设计图传达出大的思路方向,以及确立一些主要的特殊事件场景,比如阿达米亚这样的场景,因为第一关画面有点阴暗,希望第二关可以明亮起来,但是又要有那种诡异孤寂的气氛。思路明确了以后,就用unity的地形工具,以及简单的石块,快速出一个layout。这个主要是用来提供给策划,让他们明白整个关卡和气氛还有大的一些结构。

关卡策划在看了layout和概设,他可能大概就明白,像阿达米亚这样的一个场景,是一个以悬崖为主题的场景,在接下来进入白盒阶段的时候,就不会因为理解错误而走偏方向。

为什么要做这一步?如果直接让关卡来搭,很有可能气氛上、剧情上、美术等,不能很好的结合在一起。虽然多做了一步,但是只要传达出一个概念或给出一点元素后,对后期来说会省很多问题。

到了这一步,我们交给关卡设计师进入白盒阶段,在这个阶段不断的完善回滚,把角色放进去,不断的测试玩法、测试路线,待整个关卡验证完成以后,那开始用美术资源逐步的代替白盒。

这是一个当时关卡的白盒测试,主要用来测试路线和场景比例,即使是这样,有时候还是会出现比例问题。白盒阶段要搭场景,一定要搭得宽大,可能会看起来有点空,但是在中后期,中景或者一些细节东西放进去后,慢慢会变成比较舒适的比例。

我们在游戏制作过程中,确实有好多次,做白盒的时候感觉还行,但小物件一添加后,几乎没有战斗空间,最后只能砍掉重来。所以这也是需要注意的点,希望大家引以为戒。

场景的路线优化,在阶段我会要求关卡,策划同学特别注意,因为后面会用到剔除遮挡和视锥裁剪,所以前期规划的时候一定要特别注意,在路线设计的时候,要多转几个弯或者进入室内,或者让远处的视野被巨大的物体遮挡住。游玩路线会决定游戏后期的优化方不方便,这主要是控制视野内的模型面数与Draw?call。

作为手机游戏在前期规划路线的时候,确实应该要考虑这方面。

这就是遮挡剔除,比如这个场景尽量减少出现一条又长又直的路,或视野范围特别宽广的地方,比如绿色部分里露出的远景,其实运算量能接受,更远处的景已经被其他远处的房子剔除掉了,基本上不会参与运算。

如果真的有特别大的需求,要做一个大视野的场景,一般会专门去定制,比如要做一个特别大的塔,从底层到高层也都可以看得特别清楚,只是底层会做的比较精细,上面可能透掉,或者做简化处理。

场景材质我们基本上用的Substance Designer来制作,场景的材质球数量控制相对比较严格,一个场景所有的材质球在30~50之间。但是也造成了一些问题,《帕斯卡契约》本身场景有一点材质重复过高,但这就是两边的取舍,要么内存会爆,要么在视觉上做出一些妥协。

用designer来做砖墙的材质,designer的最大优势我觉得可以快速的连接节点,根据需求快速修改,快速迭代,效率会非常高。

做出来的东西也可以根据实际的需要进行修改和加工,非常节省成本,尤其是当场景比较宏大,需要很多材质重复使用时,designer 制作材质可以重新采样,随机生成符合美术风格的新材质,节省了时间成本和人力成本。

我们项目中并没有使用?unity的那套地表编辑器,主要是因为地表的场景有时候会达到3~4层,而且地表的面积相对比较窄,用编辑器比较难处理,对后期优化也比较困难。

不过具体要看项目需求。如果项目地图开阔或平整,?unity的地图编辑器是相对非常成熟的。我们这里是做了一个材质球,通过一张MASK贴图来混合两种地表纹理,用顶点色也是可以达到相同的目。

灯光这一块,场景制作与场景光照,整个游戏其实是使用了实时灯光加烘培,加light Probe。

角色、怪物,还有场景里的实时灯光,这三块灯光是分开的。主要是为了方便调整场景的光线。整体场景用的是一盏mix灯,来提供场景的主光线,角色和怪物用另一盏实时灯光来打整个人身上的明亮度和高光。

烘焙方面,我们主要使用的是混合灯光进行烘焙,模式使用的是Shadow?Mask,这种烘焙模式在用的时候有一个小小的问题,它暗部被覆盖的面积比较大时,高光会被这张MASK贴图盖住,造成整个暗部比较平。

针对问题我们使用了两种方法解决,一种是在场景本身材质上给一个环境反射贴图,让材质在暗部时看起来也会有高光和立体度。另一种是在非常特殊的情况下,在材质上模拟反向的光,让我们的程序员在材质里写了一盏反向光,它是在比较特殊的情况使用。再加上人物走进阴影里的时候,自身会打开一盏点光源,我们在山洞里或洞穴里,以及一些黑暗的建筑内部都会这样处理。

烘焙的时候注意的点,就是尽可能减少lighting map张数来控制整体的Draw Call。比如像我们项目,用了很多的预制组件,就是Prefab,那是相同的模型和相同的材质,但是由于不会被分布在两张不同的lighting map上,那它的Draw Call是不会合并的。这就有一个非常大的矛盾点,如果lighting map使用过多,Draw Call可能会多。但是如果使用得少,就要控制住lighting map的尺寸,否则阴影会很模糊。所以lighting map的UVS分布,一个会造成阴影模糊,一个会造成内存增加,这两个需要在做项目时,进行一些取舍。

关于light Probe,我们主要用来给一些动态物体附着光影,比如角色、怪物还有一些可互动的机关,后来我们发现场景里有一些特别小的物件,用烘焙的效果不是很好。

因为小物件本身UV就很小,这张lighting map压缩后,UV会聚焦在几个像素点上,像素点如果没有处理好,可能就是黑片,但如果完全不着色,这些物件在暗部和亮部的表现完全一样,那就非常奇怪,物体在暗部的时候有点亮,它在亮部的时候可能又表现得非常暗,所以我们最后后期改为使用light Probe进行着色,因为物件本身比较小,放在暗部里,本身会着一个比较暗色,其实看不大出来,反而会比烘焙的效果更好一点。

打光这块,因为场景重复度比较高,所以在制作的时候有一个概念,一定要用灯光来给玩家作为记忆点,这就造成,光对我们来说非常重要,使用相同的素材,要根据打光的不同,营造出不同的场景气氛,这是我们在整个制作场景中的一个难点。

游戏阴影这一块分为角色阴影、场景阴影,还有一些其他动态阴影。用我们投影的方法其实是一个较为通用的做法。用专门的投影相机,按光照方向给场景、角色拍一个剪影,拍到RT贴图上,再根据投影投射到地表上,无论再多的怪和角色,只产生一次Draw?Call,超出主角的范围又不会被渲染,而且这张RT贴图的格式设置,可以做一些处理,还可以加一些抗锯齿等。

场景阴影,我们基本上用的是传统烘焙阴影,其他动态阴影,比如像云雾投射下来的阴影,基本上跟角色一样,用RT贴图来实现。场景里的物件动画,像植被、飘着的旗子这些,我们基本上是用顶点动画来完成,相对来说比较省资源。除此之外,人走到草上把草压弯是以人物坐标与草的位置远近,程序控制,顶点偏移来实现。

视距这块如同前面所说,我们世界观设计的比较讨巧,整个世界处在黑雾之中,所以我们这个游戏风格开得非常强。如图例所示,这几个红圈几乎都是雾气,里面其实都可以不要有细节。

我们只要留下大石头的剪影,还有一些建筑的剪影,其他基本上能关的都关了,这样,我们做起来其实就是把这些所有的物品进行分组,根据体量分组,越大的物体它的可视范围越远。例如一些建筑剪影,或者造成整个场景的大石头,越小的物体它的格式范围越近,基本上参照这个规则,所有的物体会被分到不同的层里,然后去给每一层做一个可视范围的设置,再加上LOD,这样可以大大的减少消耗。

像我们这样做了以后,其实LOD的工作量不是很大,我们游戏里LOD用的其实并不是很多。

雾气这一块,雾气分为体积雾、定制雾片和基础雾。体积雾我们用一些Shader模拟的,基本上就是传统God?Rays那种效果,定制雾片用渲染粒子实现,我们游戏里的定制雾片,基本上是放到地上模拟流动的云雾,靠近会消失,用软粒子也不会出现硬边,是比较方便的做法。

镜头调节这一块,因为游戏里的敌兵种类体型跨度都非常大,针对不同的体型和怪物,我们做了一套专门调节镜头的工具,可以说每一种怪物,锁定他的时候都是专门独立去调节,在这个过程中还会去考虑怪物的攻击方式。

比如远程法师攻击抛物线比较高,镜头当时调的时候,距离和镜头的远近都会拉得相对比较宽一点。

在制作角色面部表情和口型动画上,我们简单的为角色设置了22个面部骨骼点来实现游戏中面部所需要的基础动画,口型和表情都是提前设置好的一段动画片段,然后根据音频调用融合的这些片段。

Blend?Tree这一块,对于3D游戏来说,不管是手机模拟摇杆,还是手柄摇杆,其实玩家在操控这些角色移动的时候,都可以朝任意方向进行移动。例如我们当时在设计维奥拉的时候,锁定目标以后的移动方式,为了拉开和另一个角色泰伦斯的区别,我们大概设计了10种,前后左右、斜上斜下10个动画片段来做融合,这就是当时维奥拉的Blend?Tree。

除了一般的走路位移动画之外,角色的攻击动画也占据了非常大的一部分资源,其中攻击和受击的逻辑判断非常重要,我们通过结合状态机的参数制,自定义曲线取值,让程序去分析当前的动画逻辑状态,实现角色在攻击动作时的一个目标的判断。

比如武器判断,根据预定的攻击类型编号,调取相应的攻击碰撞盒来实现这些做法。另外像攻击中是否可以转向,攻击碰撞打开的时机,连段判断等等,我们在项目制作中其实是花费了大量的时间来去调这些Curve的参数,这些调整的结果都直接影响了整个游戏的手感,特别动作游戏,这些手感的好坏都是拉这些曲线来实现,我们整个游戏有非常多工夫是在不停的去调整这些曲线上。

我们整个角色是用了全身的IK系统,包括人物瞄准、脚步IK、收集IK等,比如说现在看到的这张图就是人物站在不同的地表上,脚部骨骼会做出一些变形。

关卡制作,我们在做关卡的时候,其实为敌兵制作了非常丰富的状态机制,制作了若干种休息动画,隐藏的攻击动画,会在整个游戏中看到有的怪物它隐藏在角落,在这偷袭,这些都是专门定制的,怪物都会有视觉和听觉方向还有范围。

比如这张图里黄色的圈,就是听觉范围,红色的三角区是视觉范围,如果怪物在没有看见你的情况下,慢走是不会惊醒他们,但是如果跑过去可能就会引发他们的攻击。

关卡中是采用了动态加载的方式加载怪物,加载场景时会把这些怪物预先放到内存里,场景中放了很多点,又放了很多专门设置过的这种显示盒,就是这种绿色的盒子,只有角色进入绿色的盒子范围内的时候,绿盒子范围内的怪物才会被动态加载,这样的话可以比较稳妥的控制怪物的加载上线,而且也可以比较精确的控制,我想哪些怪显示,哪些怪不用显示。

最后谈一谈过场动画。说到过场动画一般是我跟编剧先聊,聊完,确定了大概的剧情,先出一个故事板,把脑子里的想法一些画面先具像化,加上策划以及程序一起推敲修改,这个阶段主要是确定一些效果是否能实现,如果不行,可能还要商量可行的方案,再继续去修改故事板。

当故事板确定以后,我们会在max里去做layout,主要是用来确认故事结构以及镜头的合理性。

我们会做一个这样的效果,这个阶段不会去加面部表情,加口型,而且会拿给配音去做参考,待他们把配音部分完成以后,确认没有任何问题,才会继续添加表情和口型。

游戏中有一些比较复杂的过场动画,为了不占用过多的内存资源,我们自定义了一套及时加载系统,在演出完成后也可以立即释放出游戏内存。根据预设的摄像机,调用角色ID以及相应的过场动画资源,比如场景风格,灯光和音效等等。同时程序也可以通过代码来控制美术的表现。

Unity的Timeline功能非常强大,早期时候我们并没有使用,是用笨的办法,实现游戏里的一些过场需求。unity Timeline功能实现了以后,我们很早就投入去使用这个东西,发现使用了以后确实非常棒,效率直线提升,而且我们结合了自身的项目,设计了一套状态控制器,可以通过判断当前操纵的角色,动态的调用相应的一些演出动画。

另外在一些简短的动画中GamePlay状态下,也可以做一些简单的一镜到底方式。

以上就是我为大家带来的一个分享,我们其实本身并没有用一些特别复杂或自己自定义的一些功能,用的还是unity本身强大的那些自身功能。这些东西的怎么使用,通过今天的分享会能给大家带来一些思考,以上就是我为大家带来的分享。谢谢。

404218

0.040025s