这几天学了不少资源导入规范相关的课程, 趁还没忘完把脑子里还记着的整理一下= =. 所有资源导入(Importer)相关的都可以自己写导入类继承AssetPostprocessor处理, 然后每天定时自动化生成导入报告, 一旦发现资源有问题根据报告找对应人员. 但是对于一些小的, 相对没那么规范的团队, 属实是想的太美了, 最后还是美术来找你让你帮着查问题. 所以我的做法是在所有preprocess阶段都不处理, 后面包装成一件优化之类的按钮, 有问题直接报出来当场修改 .
动作
-
Animation Type
首先要选的是Rig页签下的动作类型, 通常人形动画选择Humanoid, 通用(非人形骨骼)动画选择Generic. 旧版动画Legacy没用过就不写了. 一般来说Generic动画在内存和性能上稍占优势. 下面的Avatar放到模型里说. -
Resample Curves
勾选这个选项后, Unity会对动作文件进行重新采样, 将3D软件中制作时使用的欧拉角转变为四元数, 可以带来一定的性能提升, 减少在使用时实时转换的消耗, 但是会导致内存上升, 而且还有可能导致动作某些关键帧变形. 默认选中, 内存紧张时可以关闭.
详细可以参考大佬文章关于UnityAnimation ResampleCurves的优缺点分析
-
Anim. Compression
压缩分为两种类型, Keyframe Reduction会在导入动作时减少冗余关键帧, optimal是让Unity自行决定如何压缩, 可能不仅减少关键帧, 而且在存储时压缩关键帧, Optimal会把动作文件压缩的极小, 但是有些情况下会产生抖动等一系列问题. 选择了压缩后会出现Error精度值选项, 分为旋转, 位置, 大小三个值, 值越小精度越高, 一般默认值就够了. 一些为了高模展示用的动作为了不变形一般不进行压缩, 可以把这项关闭. -
Animated Custom Properties
这里可以选择每个Clips的属性, 可以根据FBX里的动作命名勾选循环等 -
剔除Scale曲线
一般的动画不会(很少)涉及到Scale的变化, 但是导入到Unity里后骨骼动画会自动生成一条空的Scale曲线, 导致文件增大. 我们可以在代码中遍历AnimationClip的所有曲线, 涉及到Scale的曲线全部删除. 如果动作涉及到了scale变化, 命名中需要体现.
foreach (EditorCurveBinding curveBinding in AnimationUtility.GetCurveBindings(anim))
{
string name = curveBinding.propertyName.ToLower();
if (name.Contains("scale"))
{
AnimationUtility.SetEditorCurve(anim, curveBinding, null);
}
}
纹理
-
压缩格式选择
纹理迭代周期短, 压缩格式要求的图片尺寸比较严格. 可以在发包前整理纹理并根据使用精度来命名并且重新设定格式. 具体选择什么压缩格式需要根据游戏类型和受众群体来衡量. IOS压缩类型通常选择ASTC, 根据精度从低到高选择 8X8 到4X4. 安卓中高端机虽然已经支持了ASTC, 但是为了适配大部分机型通常还是根据纹理是否有透明通道来选择ETC2和ETC1(甚至某些低端机只支持ETC1), ETC1,2都要求图片的宽高为4的倍数, 不符合的话直接回到RGB24bit(RGBA32bit). -
Importer格式
Read/Write Enabled和Generate Mip Maps都是占用内存极大的选项, 根据纹理具体用途选择是否开启. -
重复纹理
其实其他资源也有这个问题, 但是纹理尤其是UI精灵往往是重灾区, 有时不同界面有不同人去做, 但是没有把共用资源放在一起, 导致大量重复UI资源. 解决方法是通过遍历存放精灵(纹理)父文件夹, 遍历每个子文件夹里的精灵的MD5值, 再进行比较, 如果有重复的话就记录下来它的名字与路径, 之后手动修改删除.
模型
-
去除mesh中冗余信息
模型制作导出时, 网格里可能包含了很多已经没用的信息, 比如Normals, Color, Tangent, 2U等等, 有些可能没有用到, 有些可能以贴图形式导入, 只要判断mesh中不需要这些信息, 我们都需要剔除, 法线切线信息可以直接在importer里关闭, color等可能需要美术重新导出mesh或者通过后处理剔除. -
骨骼优化
项目中模型在制作前就应该规定命名方式(Bip, Bone…), 根节点命名(Bip 001…), 以及高低模骨骼数(根据项目规定). 在导入Avatar时, 如果是低模, 对动作展示的要求没有特别精细, 要勾选Rig页签下的Optimize Game Objects, 它可以优化骨骼节点使他不暴露在GameObject下, 从而提升性能. -
挂点
这一条是针对上一条优化了骨骼节点后的模型, 如果需要在模型的一些节点上使用动作, 播放特效, 就需要在对应的位置挂一个空的节点, 通过命名来规定节点位置. 这些节点在导入时会暴露, 可以通过代码检测命名规范和数量(一般低模不超10个). -
关闭read/write enabled(写粒子时突然想起来的)
粒子特效
-
网格渲染
如果粒子使用了Mesh作为渲染器, mesh的面数一般不能过高, 同时粒子的最大发射个数也不能太多, 否则会有很严重的渲染问题. 具体数量
一般为(Max Particles * tris(verts) < 3000). -
打开mesh的读写开关
-
网格冗余
如果一个粒子开始时在Unity Inspector使用mesh渲染, 并且选定了mesh, 后来改成了其他类型. 这个时候粒子还存这对mesh的依赖信息, 需要通过代码把mesh设置为null, 否则在打包时网格就被带了进去. 同理这个优化方法适用与Shader和材质球. 在打包时都需要清除冗余的依赖信息.