《QQ乐团》Unity3D引擎角色场景动效制作详解
QQ乐团是一款用Unity3D引擎制作的3D网页游戏,本文将从角色,场景以及动画特效三个方面来分享本项目组所使用的一些美术制作方法与技巧。
一、角色
在第一版的QQ乐团中,我们将角色的资源整体导出然后放到引擎中,这样骨骼,mesh,以及动画都在一个fbx文件中,每个模型都有一整套的骨骼资源,在存储上不仅占了很多空间,在以后的avatar换装中也很不方便,也不便于资源目录的管理。后来,程序将基础骨骼提取出来,做成prefab文件,这样只需要男女两套基础骨骼就行了,我们把男、女的骨骼单独的做成prefab,如下:
然后再将fbx文件拆解,生成独立的mesh,material,animation等文件,这些文件就按照部件的形式统一管理,也给程序的打包,调用带来很大便利。具体请往下看:
1、 Avatar的导出
先在3dmax里面把部件导出成fbx文件,然后再导入unity。导出工作会消耗掉一定时间,为让动作将更多的时间花在制作上,我们编写了批量导出插件,只需简单设置就行:
2、 FBX文件的拆分
FBX文件拖入Unity工程目录之后,默认会拆分出材质,如图:
但是,我们需要的是单独的prefab和mesh文件,以后还需要拆分动画文件,于是程序就写了个FBX拆分的插件FBXPostprocessor,重新导入FBX文件后就拆分成这样:
红框里面是我们需要的内容。
3、 Avatar的设置
a. 我们把男、女的骨骼单独的做成prefab,如下:
这两个prefab文件包含了角色的所有用到的骨骼,而其他所有的avatar部件都按规则放到指定目录。
b. 这是一个鞋子的部件,Mat0表示的是普通配置下的材质,Mat0low表示低配置下的材质,这两种配置主要是调用不同的shader来控制机器消耗。游戏会根据用户的选择高低配置来调用对应的材质,以尽量兼顾画面和流畅度。
模型相同,贴图不同的则如下图,用编号区别,每种贴图也分高低配置的材质。
由于高低配置的材质都有部分固定参数,为设置文件,我们就开发了插件来批量设置shader的参数:
c. 有时候某些镜头下,角色做特定动作时会少胳膊少腿,后经查实,是因为角色在播放某个动作时,身体的某些部件skin的包围盒的位置固定不变。这样会导致的问题就是,包围盒可能在镜头之外,而模型需要出现在镜头里。这个时候需要勾选角色部件的Update When Offscreen,如下:
这样角色在播放任何动作时,skin的包围盒会随着动作的变化而变化,这样镜头能始终看到此对应的部件。
为保证每个部件此项设置的正常,我们就开发插件来检测并批量处理:
二、场景
开始在制作场景的时候,模型做得精细,模型动画和材质动画,各种特效都往游戏里加,达到理想效果的同时,发现资源和消耗太大,光场景draw calls有时达到200多,我们就着手场景优化。
资源复用是传统的思路,我们把场景里面可能有复用价值的模型单独提供取出来,当作公共物件来管理,比如一个单面的面片,在场景里面多次出现,我们就提出来,后来发现特效也能用到它,这样就节省了资源量。
优化的思路是:
a. 尽量减少模型的个数,模型的个数比模型的面数所带来的消耗更大,它直接影响到draw calls的数量。
b. 尽量减少材质个数,能共用材质的就共用。
下面具体来看看我们的一些制作流程:
1、 场景是先在3dmax里面建好模,再导入到unity3d中,能重复利用的模型就单独提出来做成prefab。然后在unity里面完成剩余工作。
a. 单位问题
Unity的默认单位是米,所以在3dmax导出fbx的时候,要注意设置。在3dmax里面制作的时候,对单位没有特定的要求,只是在导出fbx的时候只需要保证scale factor参数为1即可,这个scale factor的值直接影响模型在unity中的大小,只要此处保持为1,模型导入unity中的单位就是米。这个值是一个相对值,并不是3dmax中设置的绝对单位:
b. 资源量的控制
能合并的尽量合并,不能重复使用的物体可以先在3dmax里面合并,可以重复使用的物体在unity里面复制多份后,利用自带的模型合并脚本合并,此脚本只针对静态物体有效:
使用场景插件来查看场景资源,可以方便查看材质,物体等数量:
c. 场景烘焙
使用Unity自带的烘焙工具烘焙,很方便。
第一步,在3dmax制作模型时,需要把烘焙的物体的二套UV展好,自动展就行,参数可自行设置:
UV要放在0,1区间内,如图:
第二步,在unity中,把需要烘焙的物体勾上Static选框:
只有勾上此选框的物体才能被烘焙。
为了检查方便,我们的场景插件能方便的查看场景中的物体是否勾上Static:
第三步,灯光下面有个控制烘焙的选项:
BakedOnly: 此灯光只用于烘焙
Auto: 当使用Dual Lightmaps模式烘焙时,此类型的灯光会根据阴影距离来判断是否实时渲染,比较智能,详情请参考http://docs.unity3d.com/Documentation/Manual/LightmappingInDepth.html
RealtimeOnly:此灯光只用于实时光照,不参与烘焙。
我们使用插件来调整所有灯光:
第四步,可以先进行low质量的烘焙,感觉满意之后再用high质量的参数烘焙。
三、动画特效
传统的动画制作方式仍然是主力,比如粒子,流光,材质动画等等,Unity的粒子特效已经能做出很多效果,但是由于项目有些特定需求,我们的一些特效还是要在代码的配合下才能实现,简单举例:
1、 代码实现
下面这个音乐波浪的跳动跟音乐的BMP数值关联,特效用代码来实现,部分界面特效也由代码实现:
2、 触控特效
以下特效只在某种特定条件下才播放一次,这时就需要在此物体上挂上触控组件:
组件里面有触控的条件设置,很方便的控制特效的开关,播放及关闭等等功能。
3、 动画合入
a. QQ乐团的角色部件和角色动画是分开导出,在引擎里面分开存放,这里便于资源管理和打包。动画导出的时候,在FBX导出界面勾选Animation:
角色动画导出时,也是用3dmax插件实现批量操作,最大量减少动作的重复操作流程:
b. 把FBX拖入unity工程目录,在有FBXPostprocessor插件情况下,会自动解压出anim文件:
如果没有插件,就需要手动把动画分离出来,分离方法如下:
选择Fbx文件下面的动画文件,然后按ctrl+D
动画文件就单独复制出来了:
如果动画没有分离出来,我们把fbx文件直接放到场景中,就可以看到动画不可编辑:
现在我们把fbx文件做成新的prefab文件,然后把动画分离出来再放上去,此时动画可以编辑了:
c. 角色在游戏里运行时,我们发现角色的脚步有小量的位移,但是动作并没有K此动画,后经研究发现导入的fbx文件可以控制动画的一些值,把下面的Rotation Error值打低后,动画就更精准。这个animation compression功能会把你的动画文件进行一些压缩以减小消耗,带来的负面影响就是动画精度降低,我们在这两者之前找到一个平衡,就是把旋转的error值降低,其他的不变,最后单击apply生效,然后在此fbx上右键,选择Reimport,就重新导入该模型了:
d. 特效,场景等动画,是直接在Unity里面制作。
在unity里面制作动画时,有两个Bug很纠结,官网上查到很多人遇到,目前还没解决办法,只有等下个版本修复,本人用的是unity3.5,这两个Bug是:
i. 将动画最后一帧往后拖,然后再往前拖,就发现有多余动画曲线:
ii. 当旋转关键帧的角度值夸过180度,夸过的关键帧有可能会转化成负角度:
本来K的关键帧是这样:
然后此Bug有可能会把第二帧作处理,就是用180减去这个角度,得到负值然后关键帧移动到负值处:
本文大概罗列了《QQ乐团》美术资源的一些制作方法和技巧,如果你对某部分感兴趣,欢迎一起交流!