Unity资源导入优化

本文介绍了Unity资源导入的优化技巧,包括动作的Animation Type、Resample Curves和压缩设置,纹理的压缩格式选择和Importer格式调整,模型的冗余信息去除与骨骼优化,以及粒子特效的渲染和依赖清理。通过这些方法,可以提高性能并降低资源大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  这几天学了不少资源导入规范相关的课程, 趁还没忘完把脑子里还记着的整理一下= =. 所有资源导入(Importer)相关的都可以自己写导入类继承AssetPostprocessor处理, 然后每天定时自动化生成导入报告, 一旦发现资源有问题根据报告找对应人员. 但是对于一些小的, 相对没那么规范的团队, 属实是想的太美了, 最后还是美术来找你让你帮着查问题. 所以我的做法是在所有preprocess阶段都不处理, 后面包装成一件优化之类的按钮, 有问题直接报出来当场修改 .

动作
  1. Animation Type
    首先要选的是Rig页签下的动作类型, 通常人形动画选择Humanoid, 通用(非人形骨骼)动画选择Generic. 旧版动画Legacy没用过就不写了. 一般来说Generic动画在内存和性能上稍占优势. 下面的Avatar放到模型里说.

  2. Resample Curves
    勾选这个选项后, Unity会对动作文件进行重新采样, 将3D软件中制作时使用的欧拉角转变为四元数, 可以带来一定的性能提升, 减少在使用时实时转换的消耗, 但是会导致内存上升, 而且还有可能导致动作某些关键帧变形. 默认选中, 内存紧张时可以关闭.
    详细可以参考大佬文章关于UnityAnimation ResampleCurves的优缺点分析

  3. Anim. Compression
    压缩分为两种类型, Keyframe Reduction会在导入动作时减少冗余关键帧, optimal是让Unity自行决定如何压缩, 可能不仅减少关键帧, 而且在存储时压缩关键帧, Optimal会把动作文件压缩的极小, 但是有些情况下会产生抖动等一系列问题. 选择了压缩后会出现Error精度值选项, 分为旋转, 位置, 大小三个值, 值越小精度越高, 一般默认值就够了. 一些为了高模展示用的动作为了不变形一般不进行压缩, 可以把这项关闭.

  4. Animated Custom Properties
    这里可以选择每个Clips的属性, 可以根据FBX里的动作命名勾选循环等

  5. 剔除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);
     }
 }
纹理
  1. 压缩格式选择
    纹理迭代周期短, 压缩格式要求的图片尺寸比较严格. 可以在发包前整理纹理并根据使用精度来命名并且重新设定格式. 具体选择什么压缩格式需要根据游戏类型和受众群体来衡量. IOS压缩类型通常选择ASTC, 根据精度从低到高选择 8X8 到4X4. 安卓中高端机虽然已经支持了ASTC, 但是为了适配大部分机型通常还是根据纹理是否有透明通道来选择ETC2和ETC1(甚至某些低端机只支持ETC1), ETC1,2都要求图片的宽高为4的倍数, 不符合的话直接回到RGB24bit(RGBA32bit).

  2. Importer格式
    Read/Write Enabled和Generate Mip Maps都是占用内存极大的选项, 根据纹理具体用途选择是否开启.

  3. 重复纹理
    其实其他资源也有这个问题, 但是纹理尤其是UI精灵往往是重灾区, 有时不同界面有不同人去做, 但是没有把共用资源放在一起, 导致大量重复UI资源. 解决方法是通过遍历存放精灵(纹理)父文件夹, 遍历每个子文件夹里的精灵的MD5值, 再进行比较, 如果有重复的话就记录下来它的名字与路径, 之后手动修改删除.

模型
  1. 去除mesh中冗余信息
    模型制作导出时, 网格里可能包含了很多已经没用的信息, 比如Normals, Color, Tangent, 2U等等, 有些可能没有用到, 有些可能以贴图形式导入, 只要判断mesh中不需要这些信息, 我们都需要剔除, 法线切线信息可以直接在importer里关闭, color等可能需要美术重新导出mesh或者通过后处理剔除.

  2. 骨骼优化
    项目中模型在制作前就应该规定命名方式(Bip, Bone…), 根节点命名(Bip 001…), 以及高低模骨骼数(根据项目规定). 在导入Avatar时, 如果是低模, 对动作展示的要求没有特别精细, 要勾选Rig页签下的Optimize Game Objects, 它可以优化骨骼节点使他不暴露在GameObject下, 从而提升性能.

  3. 挂点
    这一条是针对上一条优化了骨骼节点后的模型, 如果需要在模型的一些节点上使用动作, 播放特效, 就需要在对应的位置挂一个空的节点, 通过命名来规定节点位置. 这些节点在导入时会暴露, 可以通过代码检测命名规范和数量(一般低模不超10个).

  4. 关闭read/write enabled(写粒子时突然想起来的)

粒子特效
  1. 网格渲染
    如果粒子使用了Mesh作为渲染器, mesh的面数一般不能过高, 同时粒子的最大发射个数也不能太多, 否则会有很严重的渲染问题. 具体数量
    一般为(Max Particles * tris(verts) < 3000).

  2. 打开mesh的读写开关

  3. 网格冗余
    如果一个粒子开始时在Unity Inspector使用mesh渲染, 并且选定了mesh, 后来改成了其他类型. 这个时候粒子还存这对mesh的依赖信息, 需要通过代码把mesh设置为null, 否则在打包时网格就被带了进去. 同理这个优化方法适用与Shader和材质球. 在打包时都需要清除冗余的依赖信息.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值