本周,完美世界旗下幻塔工作室开发的轻科幻开放世界游戏《幻塔》已于12月16日正式公测,发布以来《幻塔》持续保持在免费榜冠军、畅销榜TOP10,首日流水破5000万元,最近三天更是位居iOS畅销榜第3,可谓今年年末国内市场最大爆款,取得了优异的成绩。
本月初,Epic Games中国所举办的“ Open Day虚幻引擎技术开放日”上,幻塔工作室的工程师李宁徽,就分享了《幻塔》开放世界自由探索的制作经验。
他从地形探索、物件探索、玩法探索三个层面,分享了《幻塔》在开发过程中所遇到的问题和解决办法。
以下是演讲实录:
李宁徽:大家好!我是来自完美世界幻塔工作室的游戏工程师,李宁徽。今天给大家带来的是《幻塔》开放世界自由探索制作分享,涉及的主要内容包括,作为游戏玩家在游戏世界中,对大世界中的地形、事物和玩法进行自由探索交互。
在这之前,请允许我简单介绍一下这款游戏。《幻塔》是一款轻科幻开放世界ARPG手游,以废土轻科幻的美术风格,开放式的成长线和引力式的目标感,包含丰富的大世界玩法和爽快的战斗体验为主。
在游戏中,玩家可以探索无接缝大世界,可以高度自由度交互,比如遇到障碍就跨越或者翻越,碰到高墙或山体就攀爬,跳入水中就游泳等。当然我们也可以对大世界中的一些物件,也可以进行推箱子、举盒子等操作,甚至还可以去游乐场坐过山车和旋转木马。本次演讲就是分享我们在制作这些有趣玩法过程中遇到的问题和解决办法。
这次演讲所说的开放世界自由探索,不是从游戏玩法和游戏设计角度出发,而仅仅从功能实现角度出发。比如说走过的路,地下会留下脚印,蹚过水会泛起涟漪,对大世界有所动作,大世界也会给我对应的反馈。
我简单的把实现探索世界分成了三类,分别是地形探索、物件探索,玩法探索,下面我们先从地形探索说起。
这里有一个小视频,可以从视频可以看到,玩家跑过地上会留有脚印,进入水中,水中泛起涟漪,从水中就会产生新的脚印。如果仔细看一下,从水中出来的脚印是要比没有入水时的脚印颜色是要更深一点的。之前版本里面,从水中出来的脚印还有水渍效果,后来去掉了,为什么去掉后面会有解释。
在过去很多的游戏中,脚印这样的功能已经有了,有些游戏甚至把脚印的效果做得非常好。一般对脚印的功能需求是踩在地上,留下个印子,稍微要求高一点的话,就会要求踩在不同的地表上,会留下不同的脚印。比如沙地上、草地上,脚印是不一样的。再比如说从水中出来可以添加水渍的效果,踩在雪地上会有那种的凹凸感,溅起的雪花效果等。
脚印的表现,我们可以用贴花、粒子等进行制作,用贴花做脚印的效果是好的,但贴花的性能消耗特别大。特别是贴花刚刚创建生成的时候,对于手游来说,由于手机的内存有限,表面温度、手机续航都是手游体验很重要的一部分,所以我们做了取舍。
我们只是用简单面片的来创建脚印Actor,并且对其做缓冲池处理,这个时候我们只是对缓冲池里的脚印做透明度、是否显示以及显示位置,对这些属性进行控制,不再反复地创建和销毁,以此来降低消耗,当然这是根据游戏需求和优化做出的取舍,这是为什么之前把水渍效果去掉的原因。
刚才说的脚印,其实是玩家和地面的交互,而涟漪就是玩家和水面的交互。我们可以看左边,当玩家走过的时候,涟漪是波纹状,如果是摩托车就会有把水推开的效果。而游泳、水花特效等都是玩家和水面的交互,只是他们有一个共同点,这些交互的效果只生存在水面上,而且交互对象的形态不同,所产生的效果也不一样。
气候冷暖的反应,我勉强将其称之为玩家和空气的交互,在不同的气候区域里面,玩家的表现不一样。在很冷的区域,玩家的角色会有搓手等表现其很冷的动作,在热的区域中,玩家会有扇汗的动作。其实这个制作起来很简单,在不同气候区域添加触发器盒子就可以了,当然也可以在此基础上做一些其他的玩法,比如说添加buff什么的,这些效果实现起来很简单,但是给玩家的感受却很好。
接下来我们谈一谈对障碍的跨越翻越。虚幻引擎4的移动组件中有个属性,叫,当障碍高度超过这个值的时候,玩家就会被挡住,这个时候玩家要么沿着障碍表面滑动,要么被挡住无法继续前行,虽然我们可以通过跳跃去越过障碍,但如果使用手机,不停的按跳跃就必然会影响到其他操作,而且也不是所有的障碍都可以通过跳跃跨越过去。因此对于开放世界自由探索类游戏,特别是手游,这个时候角色可以自动跨越或翻越障碍功能的需求就很强烈了。
传统制作翻越障碍的方式有很多种,但或多或少都有一些问题。比如跨越动作带有位移,那么就要求跨越障碍的高和宽有限制,而这就会影响美术的发挥。比如在障碍上添加标记、添加触发盒子等,这些都会增加额外的工作量,还有网络同步这些。所以,可不可以有一种情况,我对大世界中的任意障碍物都没有任何限制,美术自由发挥,完全是程序自动检测翻越,做出翻越的操作。
下面是我们的答案。刚才提到的那些有限制的制作方式,我们称之为策划美术驱动方式,而我们这种相当于是完全是程序驱动,也就是说,我们对地形、障碍没有添加任何限制,美术自由发挥去做,我们也不会添加标记或者设置触发器,从头到尾基本是由程序根据地形检测算法算出来的。我们算出障碍物的高度、翻越时候的落脚点,根据障碍物的高度选择合适的动作进行跨越操作。
这里展示的三种操作,分别是低、中、高。低的话,一抬脚上去了,中间稍微高一点,就需要用手撑一下,右边的比较高,需要手够一下才能翻上去。我们已经可以做到配置,可以做三种、五种甚至十种这样的方式。
现在我们来说说攀爬,类似跨越一样,我们的攀爬其实也基本是程序驱动,我们没有对地形做任何限制,美术可以自由发挥,我们也不打标记点或者添加触发盒子,通过地形检测算法,玩家可以攀爬到的地方,玩家攀爬的速度,以及玩家的朝向,完全是程序计算出来。
那么跨越最关键的地方是哪里?我们这里是,要计算出跨越后的落脚点,一旦落脚点计算出来,那么跨越的高度也就计算出来了,我就会根据跨越的高度,选择合适的动作进行越过障碍。在落脚点层面也有几点需要注意,比如地形的斜度是否允许角色站上去,玩家的可站立半径,还有在这个过程中的动作衔接问题。
刚刚说的是一些正常时候的跨越,但也存在一些特殊的情况。比如说在水中游泳时跨越障碍,游泳时候计算的落脚点相对于行走有一点不一样,但是主要的思路是一样的,就是把落脚点计算出来。然后还有右边这种,如果障碍的高度超过了我们配置的最大障碍高度,这个时候可以通过攀爬翻越来越过障碍。
当然,因为玩法的关系,比如我们策划要求在这个玩法、这个关卡里面,这个地方不允许跨越,不能翻越,这个时候怎么处理?传统用来制作可以攀爬翻越的方法,就可以在这个时候反过来做这个地方不能攀爬,就是我们可以打标记,可以添加触发器。
在这个地方有一些需要注意的点,因为我们对地形没有做任何的限制,美术可以任何自由的发挥,可以随便作,所以难免会遇到奇葩、稀奇古怪的地形,导致计算过程中,落脚点和障碍高度不准确。
比如说有一些往前倾斜的地形,有凹槽的地形,还有浮空的地形,有一个节点,胶囊体底部不是在地表的情况,都会导致计算的落脚点不是那么准确,这个时候我们就需要在地形检测算法中添加一些额外的检测来避免这些问题,所以我们的地形检测算法也是在不断的优化迭代的过程,慢慢变得成熟。
现在我们来说说攀爬,类似跨越一样,我们的攀爬其实也基本是程序驱动,我们没有对地形做任何限制,美术可以自由发挥,我们也不打标记点或者添加触发盒子,通过地形检测算法,玩家可以攀爬到的地方,玩家攀爬的速度,以及玩家的朝向,完全是程序计算出来。
在虚幻引擎4中,因为攀爬是一种脱离重力的表现,而且一旦脱离攀爬就会掉下来,所以我们的方案是,用移动组件里面的模式模拟攀爬的移动状态,我们还有很多自定义的子模式,分别应对攀爬的不同的情况。比如说各个方向上的自由攀爬,攀爬跳跃、攀爬回跳、雨天攀爬打滑的状态,攀爬翻越等,在攀爬的时候,我们的角色会通过动作融合和蒙太奇配合,让攀爬的状态更加自然合理。
这边展示了三种进入攀爬的情况,分别是行走进入攀爬、下翻进入攀爬、空中进入攀爬,其实还有一个水中进入攀爬。三种检测攀爬的计算方式是都不一样的,但有个共同点就是首先要找到可以攀爬的面。
现在我们展示的都是自动进入攀爬,之前的版本在进入攀爬的时候有过一个非常不好的游戏体验,玩家在操作手机的时候,是不希望进入攀爬,只是想走进去,特别是室内的情况,只是想走进屋里看一看,这时候一旦碰到障碍就进入攀爬了,比如说爬到墙上或者柜子上,体验非常糟糕。
我们怎么处理的?一个是,我们在游戏设置里添加了选项,玩家可以选择自动进入攀爬,也可以选择手动进入攀爬。二是添加了进入攀爬的动作,在这个动作里面添加了Anim State,如果期间没有移动输入没有被打断,就进入到攀爬,但如果在这段时间里,输入突然停掉了,就表示不想进入攀爬,就会把进入攀爬动作打断,不进入攀爬,以这样的方式解决问题。
攀爬跳跃,这方面其实也是攀爬中的重要元素,我们可以把攀爬跳跃可以跳的距离、速度作为参数抛出来,策划可以进行配置,当然也可以在游戏中根据玩家的属性动态修改。
这样做的好处是,我们所能到达的位置能够不受骨骼位移里,自带的位移和朝向的影响。右侧显示是凹形地形的表现,一般的运动模式,比如说行走、游泳,它们一般是在X轴和Y轴水平方向上,但是攀爬是三个方向上的,所以这边我们讨了个巧,因为攀爬时和地形息息相关,攀爬始终贴着地形,一旦脱离地形就要掉下来,所以在X轴方向,也就是前后方向,我们始终让玩家往前紧贴地形,这样我们就可以把我们更多的注意力集中在Z轴和Y轴方向,也就是前后左右方向,这样我们相当于把三个方向的计算省去了很大一部分,变成两个方向的计算。
拐弯的时候,玩家的朝向需要注意一些,特别是右边的凹形地形,我们的手其实是沿着地形滑过来的,这是用IK,我后面还会提到。
攀爬跳跃,这方面其实也是攀爬中的重要元素,我们可以把攀爬跳跃可以跳的距离、速度作为参数抛出来,策划可以进行配置,当然也可以在游戏中根据玩家的属性动态修改。
玩家摇杆或者键盘输入会有一个方向,我们沿着这个方向做检测,算出攀爬跳跃的结束点,配合蒙太奇在这边进行攀爬跳跃,左边是各个方向的攀爬跳跃,中间是凹凸地形上的,我们会爬到凹凸地形上转向等,右边是攀爬到顶了会翻越上去。
这是IK( ),即反向动力学,相对FK来说,它是用子节点驱动父节点。它的实现方式就是用动画蓝图里的Two Bone IK节点。这个节点有两个参数,一个是,一个是Joint 。
可以这么理解,目标点,攀爬的时候手要搭在哪里。比如说踩在阶梯上脚放在哪里,要通过计算算出来。而Joint 节点,因为在多骨骼计算的时候,计算出的结果是无限多个的,所以要通过Joint 的参数来确定唯一解,避免出现反关节的不合理情况。比如爬的时候,肘关节都到脸上了,这种情况就可以通过这个参数来避免。
如果站在台阶上,脚是分别踏在两个不同的台阶上,当地面不平的时候,脚面是要贴着地面做旋转。再比如爬树的时候,手抱着树,如果是凹形地面,手是分别搭在两边的。有很多关于IK好用的教程和插件,比如说,但是其对于移动端的支持其实还是有一些进步空间,特别是旋转这一块,所以我们游戏里面主角的IK基本上都是我们自己实现的。
滑板是地形探索里面唯一一个涉及到海陆空,也就是说我们承载移动组件里面的、、三种运动模式实现滑板。它需要注意的点就是在这几种模式切换的时候,我们要保证动作和速度可以很平滑的过渡过去,我们做这个目的是为了让玩家在操作的时候有爽快的感觉。
滑翔,因为人类不可以飞,所以在游戏里可以飞或者滑翔是很好的游戏体验,所以我们就制作了滑翔。它是通过重载移动组件里的来做的,我们修改、优化了它的转向,以及重力加速度来实现滑翔。
游泳方面,虚幻引擎4里面其实有游泳模式,我们也添加了一些自己的东西,比如说加速游泳,还对它的转向做了优化,因为手机上的遥感有一些特别,所以我们在这一块比较花心力的是,在手机上的操作手感,这方面我们花了一些精力去做优化。
这里总结一下,我们所有地形探索遵循的一个原则,就是一句话,胶囊体负责位置,Mesh负责表现。
胶囊体负责的是碰撞、位置同步,而且我们所有地形检测的算法都是从胶囊体开始的,也就是说,胶囊体是出发点,我们所有的地形检测算法都是从它开始做同步。
而Mesh主要负责视觉效果,比如视觉效果的平滑过渡、不同状态之间的切换、动作的衔接,包括IK等。举个例子,比如攀爬的时候,前面正好有一个东西把我顶出来了,那我的胶囊体肯定就会顶歪,但这个时候Mesh不能歪,一旦歪的话就相当于脱离了地形,就掉下来了,这个时候就可以让Mesh往前抓紧贴地形,相当于允许Mesh稍微脱离一点我的胶囊体。
下面我们看物件探索,首先看推箱子。我们实现了两种方式分别是:模拟物理的和不模拟物理的,两种推箱子有各自的优缺点。模拟物理方式的箱子,在掉落、碰撞、滚落等情况的表现更为自然,效果特别好,但是有一个很不好的缺点,就是不可控因素很多,如果地形不平,碰撞角度、速度、力度不同,所出来的结果是完全不一样的。
特别是在一些玩法的层面,左边这是一个激光,我要把箱子推到那个地方才能打开机关,但如果是用模拟物理的箱子,可能我每推一次结果就不一样,就完成不了。
所以我们就做了第二种不模拟物理的推箱子,这种方式推10次,推20次,甚至推100次,始终能把箱子推到这个地方来,保证结果一样。所以在大世界中,我们交互的箱子一般是采取了模拟物理的这种,而在机关或者一些简易玩法里面我们选择了不模拟物理的箱子。
举抛方面我们是这么实现的,我们制作了t的一个组件,凡是拥有这个组件的物件都是可以进行操作的,包括举抛。在抛的时候,其实就是把物件到指定的点上,然后配合半身动作实现举起移动,抛的时候会通过玩家输入获得指定方向,在那个方向给一个初始速度,并启动模拟物理来实现的,就抛出去了。
砍树方面,树是由植被系统刷出来的,当我们挥刀砍的时候,刀的Mesh就会和树的Mesh发生碰撞,这个时候会播放树被砍倒的效果,然后用树桩的Mesh替换树的Mesh来实现砍树,过一段时间再将树桩的Mesh替换回树的Mesh就刷回来了。
草也是由植被系统刷出来的,但是草和树不同,草没有碰撞,因此实现的办法是在AT表上做标记,然后在那个位置播一个砍草的效果,如果要恢复就在一定时间把AT标去掉,把这个草重新刷出来实现砍草。
我们现在看看过山车。我们提供了好几种视角,玩家可以根据自己的喜好去选择一种适合自己的视角。其实最开始我们是没有计划做过山车的,在于之前的测试里面,有玩家跟我们说,我们都到游乐场了,有那么一个东西为什么不能玩,我们要玩过山车,我们就做了这个东西。
最后,我们公司的《幻塔》马上16号就正式公测,如果大家有兴趣可以体验一下。如果你们愿意加入我们,也欢迎联系我们,当然如果只是作为一个游戏玩家,你也可以把奇思妙想,通过邮件或者留言的方式告诉我们,说不定你的想法被采用,我们就把他实现了,就像之前所说的过山车一样。
我们希望这种方式实现的交互越来越多,因为这就会使玩家有一种参与游戏开发的感觉,我们也希望后面会有越来越多这样的东西出现。
我的演讲就到这里,谢谢大家!