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

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

一眨眼,《勇士online》团队解散已经将近两年。研发《勇士online》这个我完整地参与了从立项到上线运营整个过程的网络游戏,在风光旖旎的厦门,我度过了和大学四年一样长的时间。作为人生中一个重要的阶段,在这四年中留下了很多值得回忆铭记的人和事。在往事逐渐随风飘去之前。我决定汇集脑海中留下深刻印象的这四年中的人和事。此记。

2006年岁末,带着在深圳tencent不甚愉快的半年工作经历,我回到了家乡,计划在家乡休息学习一段时间,整理归纳工作三年来的一些业务技术心得。主要是翻译在tencent使用过的Gamebryo2.1引擎帮助文档,还有就是剖析一个小型的DirectX8框架——dxframework。通过研究这个小框架我进一步地理解了3D图形渲染的基础理论,甚至还写了好几万字的剖析文档。但可惜计算机的发展日新月异,较之Direct3D8,现今的Direct3D11时代,完全的可编程管线已经取代了固定渲染管线,3D渲染编程方式上发生了翻天覆地的变化。所以dxframework框架也早已被管理员放弃了维护。

约在2006年11月初左右,认识于珠海kingsoft,曾共事于onwind的CQ也刚赋闲。在CQ赋闲之前,我曾联系到之前也一起在onwind共事的jokiting,那时jokiting已经在厦门9you上班了,于是我电话建议CQ去厦门9you试一试。最后CQ约在2006年11月中下旬左右入职了厦门9you。我则留在家中继续学习。转过2007年1月左右,再次联系CQ,得知他已加入一个项目了。新项目是一个“格斗游戏”,用的是Gamebryo引擎。我当时也打算继续做3D客户端网游,加之又对Gamebryo有过些编程经验,所以就萌生了自05年初离开后,重返这个小岛的想法。于是就给CQ发简历和demo小程序,和他打过招呼,年后就回厦门看看。

2007年的农历新年来得特别迟,2月17日了才除夕。所以拖到3月1日我才动身去厦门。下了火车,想起两年前和送自己回家的CQ和另一位同事liaoweiqing说的:“我还会回来的”,感慨万千。厦门火车站依旧是那么狭小拥挤,虽说9U所在的软件园一期其实我在05年初去过一次的,但还是打了个车直接到了软件园一期。在公司电梯口见到了正准备下来接我的CQ。CQ人样依旧,只是比两年前要清瘦了一些,可能是因为坚持长跑的缘故。寒暄了一阵,他帮我把行李暂放在办公室内。然后就继续上班了,我就按照流程填表格面试。

首先进行技术面试的是另一个《劲爆滑板》项目组的主程序xzy。他针对我简历中所罗列的工作经验和技术专长做了一些提问,我的回答他觉得OK,然后就是由两位公司两位高管,seasonwind和sabina面试我。

Sabina也可谓是一个传奇人物。她毕业于沈阳音乐学院。作为中国游戏业界最早的一批从业人员,她是在厦门新瑞狮起步的,和onwind的老总lls,zechuan,以及一些我认识于珠海kingsoft的资深美术,如yes,xiaohua,还有一位曾共事于onwind的jiaoqiang。都是从新瑞狮出来的同一批战友。后来她被调任到南京新瑞狮担任管理工作。新瑞狮解散后,在业内几经沉浮波折,最后在9U的老总王先生的投资下,在厦门成立了分公司,主打研发。Sabina作为常驻厦门的分公司主管,还兼任了当时尚未正式命名的CQ所在的项目的“格斗游戏”制作人。

sabina问我,为什么想来厦门9you。我回答:环境好,心情能静下来,有熟人,最关键的是,之前在其他公司参与的项目,虽然有上线的,但要么是开了个头,要么是结了个尾,而我想从头到尾完整地完成一款游戏。sabina对我的这个想法表示赞同。其他的问题也就和一般的面试差不多,谈妥了薪金之后,就等入职通知。

按CQ原来的设想,希望在游戏中引入物理引擎,以增强游戏的真实感。最简单地说,就是希望通过物理引擎,根据角色受打击的位置,作用力的大小和方向,去实时地计算出角色应有的表现动作。比如,当角色处于待机动作时,用同样的作用力,踢向他的躯干和腿部,所需要播放的动作应是不同的。踢向躯干,可能会使受力角色向后飞出去。而踢向腿部,则可能让受力角色原地摔倒。如果在采用传统的3D动画的实现方式,就要在建模阶段预先建好各种可能的受击表现——这显然工作量实在是太大了。而且预编辑动画的仿真度是远远不够的。所以对“格斗游戏”来说,引入物理引擎是必要的。在项目开始之初,既然大家的概念都是做一个“格斗游戏”,那么引入物理引擎是一个很自然的选择,因为厦门9U这边的人事招聘都需要走一遍“通知上海总部,然后由总部回文确认”的流程,所以在等待从2007年3月1日到15日这走流程的两周时间中。我在黄厝村塔头社,CQ住处旁边租了一个小房子,开始着力学习PhysX。

2007年3月15日,我正式入职,当时的团队还不是很多人,当时的策划团队有四人,主策划是chenliangsen,执行策划是做数值的zhongjinde,文案和系统策划绯红和guojian。“绯红”是男的,只是他的RTX签名一直都是“绯红”,所以大家都叫他“绯红”,或者“小红”。最搞笑的是数值策划zhongjinde,因为他的工作是数值设定为主,工作环境就是excel。所以他效法人们对孔丘的尊称,给自己的RTX签名起了个雅称“表子”,这事情一时传为笑谈。无独有偶的是后来有一位新数值策划加入,也因为精通excel操作,被大家尊称为“表哥”。

当时的美术团队是主美shentao,其他美术成员则有linxi,zwf,小刘忙,老俞,fb,xuchaoyuan,老苗,xiaoxing,以及被大家合称为“ZP”的两个女生:zl和pf,等等。xiaoxing是和我同一天入职的。其中linxi主要负责3D角色建模,yudefang和zwf则是3D场景,fb负责3D角色动作。xuchaoyuan则是原画。老苗,zl,pf做2D界面为主。xuchaoyuan的学历不高,但他艺术天赋过人。后来在业界他也闯出一点名气,此乃后话。

客户端程序有我,CQ,djj,zhw,yuanhui四人。服务端程序有后来调任为项目主程的hy,zhangronggan,xiexiaoyong,以及rojane四人。还有两个女实习生程序,一个是厦大的硕士生xuxu,还有一个则是解放军通信工程学院毕业的CQ的同乡wangxin。一开始的分工是CQ去学习gamebryo引擎,djj去做UI界面,zhw则做网络通信和上层逻辑相关的东西,yuanhui则搭建整个游戏客户端的初始框架。而我就负责学习PhysX引擎,研究在游戏中引入物理系统的可行性。

PhysX引擎开发得比较早,但Gamebryo引擎则到2.3版本才开始对其加入支持。并且仅支持PhysX2.6.2版本。现在回过头来看,我认为Gamebryo2.3对PhysX封装得很不完善,尤其是偶人(rag-doll)动画系统做得严重不足。当时的Gamebryo-PhysX系统无法对物理动画和预编辑动画作完美混合。也就是说,当播放物理动画时,预编辑的3D动画就要停止播放,等物理运算结束之后,3D预编辑动画才重新接管角色的动画播放。这个还不算是最严重的缺陷。更为严重的问题是,当时的Gamebryo-PhysX系统所支持的偶人动画角色,仅能作为“受力方”。即物理引擎只能被动地接受外界的作用力输入,去实时计算出受力时应作的表现,而无法给把角色本身视为“施力方”——当时的Gamebryo 3DS Max插件,也仅仅是做到了给角色模型绑定了偶人动画骨骼,而无法给角色模型本身加入一个施力点。这样子的话就会带来问题。因为在格斗游戏中,受力方所受到的作用力,是由施力方依据不同的动作发出的。如果不能在角色模型中编辑指定的话,就根本无法产生逼真的击打效果。就好比下面的示意图

女剑士使用了一招月星闪。如果使用物理引擎去实时计算受击方的受击动作的话,那么,女剑士的劈剑方向和力度都将会决定了受击方的表现。忽略作用力大小不考虑,单考虑施力方向:如果女剑士是从上往下劈斩的话,那么对方的受击部位应该是上半身,那这时候对方的表现应该是两腿一软被砍倒地。而如果女剑士是从下往上挑斩的话,那么对方的受击部位则应该是下半身,这时候对方的表现应该是被挑飞到空中。如果要考虑作用力大小的话(试考虑街头霸王中的“轻拳”,“中拳”,“重拳”之分),情况就更复杂——不仅是受击方的受击表现,施力方的发招表现也有不同,比如一般来说,轻拳出招力小势轻,收招快,能快速转防守状态。重拳出招力大势沉,收招慢,留有破绽多……。凡此种种,非常复杂。很明显,要完成上述的功能,最起码的,施力方的攻击动作的相关物理参数,如施力方向和大小,要可编辑才行。而彼时的Gamebryo-PhysX系统应付不了这个最起码的需求。所以,在当时并没有完全确定我们要做的游戏到底是什么样子的情况下,不能钻牛角尖,必须走另一条路子。