集え!勇士の名の下に --《勇士online》研发回忆录 4

本文是用第一人称记载的真人真事,里面涉及到了大量他人的名称等信息,所以为了避免不必要的纠纷,谢绝转载

计算地表高度的方法很传统也很经典,就是用一根射线从无穷远处,以垂直于水平面的方向向地表网格投射,计算出这射线和地表网格中的某个三角形的交点。这个交点的高度值就是这一点地表的高度。了解了这一点之后,问题就变成了:构成地表的网格那么多,到底要向哪一个网格投射射线?在何处投射射线?投射多少根射线?

为了标识出需要投射的网格。客户端程序和美术部门约定,在对场景建好模之后,在所有的可通行的区域,紧贴着地表网格,贴上一块名字含有walkable字符标识的网格。要和射线进行投射相交检测的,就是这一块网格。在客户端,以每10unit乘以10unit的大小把walkable网格划分成若干虚拟的格子。射线向每一个格子的中点做投射,如果能求到交点就表示这格子能通行,记录下交点的高度值,如果求不到交点就表示该格子不能通行。

客户端采用10unit乘以10unit主要是为了精确,如果格子过大的话,就会出现角色脚踩的地方和真正表示该格子高度的交点不重合,而可能导致角色的脚会陷下去,或者浮起来的问题。但服务端如果采用10乘以10的大小的话,数据量又过大了。所以服务端采用了100unit乘以100unit的大小作为服务端的地表格子。后来发现100乘以100又过大了,经常会出现因为精度判断不一致的问题而导致客服不同步。最后选用了60乘以60的大小。

一开始时投射线算地表高度的算法,客户端和服务端都是使用了同一套算法。只是因为单元格的大小不一样,所以投射的位置点也不一样,这时候,会出现某一个“客户端小格”,在客户端计算所得到的值,是可通行的,而服务端对应的那个能包住那个“客户端小格”的“服务端大格”,却是不可通行的情况。这一问题,导致了后面角色使用技能攻击时,经常有一些怪物被轰击出场景外,被卡在那里,走不进去,也走不出来的囧况。

除了要计算地表的高度之外,按策划的要求,还需要做一个能“刷怪”的关卡编辑器,所谓“刷怪”就是在关卡里面摆放会出现的怪物或者NPC。策划部门早期给的需求很简单,就是用一两个小方块代替了怪物或者NPC本身的模型。在07年的时候这个简单的功能是够用了,但转到后期大批量“刷怪”时,就显得捉襟见肘了而不得不重新编写关卡编辑器了。由此可见对项目的统筹管理,“未雨绸缪”是多么的重要,能想得到的事情就要预先去做而不是等到以后。当然,这也就是后话了。

约在2007年7月,第一个版本的关卡编辑器我就做出来了,功能很简单,甚至可以说很矬。主要就是导出地表高度和简单地刷怪。为了能在事后对关卡编辑器生成的文件便利地修改。还附带着做了一个简单的文件观察器。

约在2007年7月,第一版关卡编辑器出来之际。Epic中国的副总裁刁劲翀到访厦门9you。刁先生此行主要是给Epic的神器——Unreal3引擎做宣传。Unreal3引擎有多强大这个无需我多言了。除去渲染内核之外,刁先生还演示了引擎周边的各式辅助开发工具。如场景编辑器,剧情事件编辑器,甚至还有和物理引擎相关的编辑器。我当时提出想看看Unreal3引擎是怎么处理偶人动画的。刁先生就现场演示了用相关编辑器拖拽一个偶人模型,编辑偶人的关节,指定各种参数,等等。同是使用了PhysX引擎作为底层的支持,Unreal3就封装得完善得多。

CQ在观看了刁先生操作了Unreal3的模型动画编辑器后,提了一个问题:“顶点动画和骨骼动画是用两种截然不同的算法思想实现的,Unreal引擎是怎么做到一个模型能同时混合播放顶点动画和骨骼动画的?”对此,刁先生没有正面回答,他只是点出了:无论是顶点动画也好,骨骼动画也罢,最终还是归结到操作构成模型的每一个顶点,使之产生位移,以产生动画效果。既然都是操作顶点,那么就自然会有办法让这两种动画融合在一起。

刁先生的这番回答让我想起在Gamebryo-PhysX中,当物理系统接管负责播放模型的动画时,预编辑好的模型的骨骼动画就不能播放了。也许是Gamebryo的开发人员,在封装的PhysX时,没有考虑如刁先生所说的,最终的任何动画归根结底就是操作顶点。他们只是为了方便,就有一种播放动画的方式,就只能一次单独播放一种的吧。

Unreal3的演示完毕之后。《勇士online》开发组的评价就是:和Unreal3引擎相比,我们用的Gamebryo就好像是处于原始社会阶段。客观地说,确实如此。但在随后的5年时间里,我目睹了很多用Unreal3引擎开发最终却搞砸了的游戏。我不得不在此谈谈关于选择引擎的看法。

Unreal3引擎很强大,这不假,但强大带来了两个问题,第一个就是价格问题。作为世界顶级的游戏引擎,并且提供了如此完善的周边开发工具,其价格也是不菲的。对于处于创业阶段的中小团队来说可谓是天价了。如果说中国不缺资本,缺的是知本的话。那么第二个问题就是学习成本的问题。Unreal引擎提供了那么多的周边开发工具,每一个工具能用得好来都能成为一方专家了,更遑论要去寻根问底去追踪剖析它的源代码实现了。一个开发团队,想吃透Unreal3引擎,两三年的使用也仅仅是登堂入室而已,要成为专家级的人物不用它做过两三款游戏都算不上。如果单从“能实现很酷的3D效果来看”,Unreal3等大型商业引擎当然是当仁不让的头号选择,但“实现很酷的3D效果”的另一个前提,就是需要很酷的硬件支持。而网游产品则是要面向于普罗大众;面向于一台电脑用个三五年都不升级的屌丝。作为一名什么都不考虑,只痴迷于技术的程序员来说,有得用Unreal引擎当然能满足他的好奇欲和征服欲,以及一些莫名其妙的优越感和满足感。但作为技术总监,项目负责人,或者作为战略决策人的老板们,则要通盘去从人力成本和金钱成本等方面上,综合考虑抉择。如果不顾当前的实际需求而片面地搞些噱头,不是一个成熟的决断。可惜,纵观业界,尤其是一些有抉择之权却无抉择之技术分析能力的老板们,搞商业宣传商业忽悠到最后,连自己都忽悠到了,令人扼腕叹息。

刁先生的推荐演示在厦门没什么收获,厦门开发团队还是坚持使用了Gamebryo引擎。但在北京9you,Unreal引擎却得到了他们团队的负责人的青睐。北京9you主打的产品,在07年年底立项的《神兵传奇》,就是采用了Unreal3引擎开发。

2007年的中段,《勇士online》项目,厦门9you,乃至整个9you,表面上都风平浪静,各项目各部门都在有条不紊地做着自己的工作。9you上海总部那边正为9you网在日本上市做着大量的工作。从《劲舞团》系列的火爆程度,以及北京上海厦门各研发团队各项目都已全线铺开的势头来看,整个9you上下对这次在大阪证券交易所的IPO成功,都抱乐观态度。

2007年6月份,大阪证券交易所发布公告,称9you网的上市申请已获得核准,将于7月12日正式挂牌。9you将成为继盛大和九城之后第三家以网游概念上市的中国互联网企业。7月4日,9you网确定IPO发行价为每股20万日元(约合1632美元),融资174亿美元。

然而,就在这时候,意想不到的事情发生了。从某个意义来说,《勇士online》,甚至整个9you,命运从这时起,发生了改变。