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

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

在上市计划失败之后,也即2007年的下半年,厦门分公司这边并没有受到太大的波及。因为纵使上市失败,9you依然是一个盈利的公司,走自研产品路线依然是公司的战略方向。所以上海本部及北京厦门的分公司的各个项目组,依然按部就班地进行开发。而我在这时候负责了游戏的特效播放模块和相关的工具。

如果要问什么是特效,时至今日,去问一个中国游戏业从业者,估计一百人有一百个回答。如果问一名策划,他可能会说:特效就是那种看起来很酷炫的各种风雨雷电刀光剑影。如果问一名美术,他就可能会说:特效么,就是除去场景、角色模型与动作、UI界面之外的其他的美术的统称。如果问一名程序,他可能会说:特效,可能就是用粒子系统、帧动画、还有就是一些特殊的着色器做的效果吧。的确,出发点和看待事物的角度不一样,便会得到不同的答案,而这也往往是导致各部门之间沟通困难,有时候甚至是鸡同鸭讲的情况。

从程序的角度上来说,大部分游戏所看到的“特效”,确实是使用粒子系统技术去实现的。GameBryo2.3版本的粒子系统已经做得非常之强大。可以直接从3DS MAX/Maya中导出特效文件到引擎自身的Nif文件中。现在热门的Unity3D引擎则没有采用这种直接从3DS MAX/Maya中导出的方式,而是自身实现了一套名为ShuRiken(这名字实质是日语“手里剑”的发音,即俗称的“忍者镖”)的粒子编辑器系统。这两种方式各有优劣在此不予以对比评论。但在当时,这种直接从美工熟悉的工具中直接导出生成游戏引擎可用的特效数据。对于降低学习成本,提高生产力是大有裨益的。

GameBryo2.3的粒子系统的核心类是NiParticleSystem,这个类表征了“粒子系统及粒子”概念。每一个NiParticleSystem可以绑定若干个修改器。这些修改器用以控制粒子系统中的粒子的生存期、包围了整个粒子的包围体、粒子的平移旋转放缩、还有就是对粒子的基本物理学模拟。

除去修改器外,NiParticleSystem还绑定了时间控制器和粒子发射器。时间控制器是用来控制粒子系统,随着每一帧时间的流逝,更新粒子及整个系统的相关属性的。而粒子反射器则是用来控制粒子的发射方式。例如NiPSysCylinderEmitter类就是用来控制粒子以一个圆柱状的样子发射出来。

在游戏引擎已经做了大部分的特效播放所需的基础工作前提下,游戏的特效播放模块和相关的工具所要实现的功能就变得较为简单了,要解决的问题就是“在何时何地去播放”的问题。在“何地”是一个很简单的transform setting的问题,即把特效资源的root node指定好它的parent node,以及设定这个root node在parent node的局部坐标系下的position,rotation,scale即可。而在“何时”播放则是一个涉及到上层逻辑,并且会涉及到网络同步通信的事情。

大约在2007年月,我做了第一个编辑特效播放逻辑的工具。这个工具当时实现的功能也可谓是比较简陋,主要就是给定一系列的特效nif文件,一系列的角色动作模型和动画序列帧,然后给某个角色模型的某一个动作序列帧,通过一个text key标签,指定在这个动作序列帧中某个时刻,播放某个指定的特效nif文件。然后把这些特效文件集合,角色模型及动作集合,以及特效与动作之间的关联关系,存储成一段lua代码脚本,运行时调用此lua脚本就能达到播放效果。

上面的图就展现了这样的一个关联关系:指定一个企鹅模型,企鹅模型有若干的动作序列,选取了名为walk01的序列,然后在序列帧中的第0.317238秒除,指定一个名为testattack~SS-LeftFoot-Emitter~Women_attack_effect的text key,即一个标签,然后在这个标签上绑定一个名为Women_attack_effect的特效文件。

在项目早期,用一个编辑器,把某个特效绑在某个动作上的方式是可行的——因为在这个阶段的需求原本就是很简单的,但随着项目的开展,绑定在角色动作上的特效播放,已经随着“角色技能”这一概念内容的丰富,变得包含了很多需要和其他游戏属性的相关联了,所以我早在2007年就做的这个编辑器的功能是远远不够的,而角色技能的流畅感,打击感是action game的核心体验,在经过多次反复和挫折之后,角色战斗和技能这块,最终还是没有使用我的这个编辑器去生成的数据,也因为我后来接手了游戏别的模块,没有去扩展这个工具。所以最后由专职程序专职动作美术专职动作策划,去一个一个动作调试绑定——当然,这已经是08年后半段的事情了。以技能绑定特效播放这一块为例,何时去播放特效,就是逐个逐个手动地去反复试验,试到特效的播放和角色动作刚好合拍为止,然后填写到表格上。一个技能有多复杂,里面涉及到有多少参数,从下面这个表格中的一个表项就可以看出端倪:

上述表格中有effect0到effect4共五个标签,表示一个技能所对应的一个动作序列上,有五个可用的技能特效位。这个五个技能特效位对应了动作序列上的五个text key。text key则是按照约定的规则,由动作美术在3ds max中指定并导出——这样子就可以使得美术和策划在3DS MAX阶段就能准确地定位播放技能特效的时间和位置。

整个2007年的下半年,项目组表面上风平浪静,然而背后却危机重重,首先公司最初给的时间是“一年内把东西做出来”,但到2007年底为止,整个产品可看到的内容,仅仅是主角在新手村场景跑一跑,还有就是几个简单的界面UI。到底公司对这个项目抱何种态度,还做不做?一时间人心惶惶。其次是到底要做成什么样子的一个游戏,是一个RPG,还是一个休闲竞技类的游戏?2007年一年也快过完了,都依然处于摇摆状态。以chenliangsen为主策的策划团队,在多方面的压力之下,处于风雨飘摇的境地。而程序与美术之间一些工作上的争执,程序组前端后端之间一些人事之间的龃龉,也逐渐浮出水面。在这个前途未明的局面下,大多数人,包括我自己在内,都发生了动摇。一些2007年入职的同事,包括美术,策划,程序,纷纷提出了离职。