妖尾历经几年开发,终于在今年6月底顺利上线,笔者从2017年初参与开发,主要负责妖尾战斗系统开发。战斗作为游戏的核心玩法系统,涉及很多技术点,希望能借几篇文字,系统性总结MMORPG战斗系统的开发经验。
本文主要从宏观层面总结回合制游戏战斗的美术资源规范,系统框架设计和主要技术点,比如断线重连,技能表演等。
系列博文传送门:
记录战斗记录你,详解妖尾战斗录像系统
美术资源规范
模型
模型分为低模(1500-2000面)、高模(6000-10000面)两种规格,战场单位统一使用低模,但在合体技等镜头动画表演使用高模。主角模型是由头、上衣、武器、下装4部分组成的,游戏中通过网格、贴图合并成1个完整模型进行展示,这样可以实现部件换装。非主角模型比较简单,直接加载完整模型。
挂点
高低模都有头、脚、血量、受击、左右手、左右脚等挂点,高模相比低模额外多了表情挂点(下文解释挂点作用)。
材质球
高模跟低模使用不一样的材质球。低模全身只用了一种材质球,而高模用了两种材质球,脸部和身体分别是不同材质球,脸部材质球实现了uv动画用于做表情变化。高低模的身体材质球都实现了描边,高模额外开启了自阴影。高模贴图为256x256大小png图片,低模为128x128大小png图片,贴图都是宽高相等的POT尺寸,这样Android/IOS可以分别使用ECT2/PVRTC压缩格式。
表情实现
人物表情是通过shader uv动画实现的,索引0-3从分别对应下面贴图的4个表情。由于shader是项目TA编写输出的,要让动作美术能够控制表情变化,我们定了个表情挂点位置映射索引的规则,表情挂点x轴数值除以100向下取整即为索引,动作美术在动画时间轴里只需要编辑表情挂点的位置,通过程序转换设置shader参数,就能控制表情变化。
动画
战斗单位的动画状态机具有非常多的状态,有多达60+多个动画,但常用动画只有其中几个,所以战斗单位不会在进入战场时一次性加载所有动画,默认只加载站立、受击、奔跑、死亡等4种动画。其他动画则每回合按需加载,我们会按角色预先存储动作和对应资源路径的配置表,需要用到的动作查表获取路径加载资源,作为AnimationClip加载到RuntimeAnimatorController上。另外,像受击浮空等动画还需要处理好依赖,相关的过渡动画也要一并加载。
技能
技能是使用Flux编辑器制作出来的,通过时间轴上创建多个Sequance轨道来组成一段技能表演,每个Sequance脚本负责1种表现,如角色移动、播放特效等,Sequence脚本共同作用就能表现出一段技能。1个技能最终生成动作、音频共2个Prefab。1个战斗单位拥有的技能也非常多,不会在进入游戏时一次性加载,也是每回合按需加载要用到的技能。
Buff
Buff相比技能表现要简单,因为最多只有添加、持续、触发、移除等4个阶段需要做表现,每个buff prefab挂相应的4个脚本,配置特效资源,人物动作,替换材质即可。
美术资源流水线
主角模型与非主角模型的资源提交规范稍有不同,但制作流水线基本是一样的。美术提交包括模型fbx、动作fbx、动画机,材质球、贴图等资源,通过工具脚本进