Unity 项目美术资源规范的一些建议

2021-03-24  本文已影响0人  太刀
美女镇楼

在做 Unity 项目中,不可避免的要跟贴图、模型、动画等等美术资源打交道,一个完备合理的资源规范是很必要的,本文总结了一些我在项目中关于美术资源规范的的一些实践。

1. 纹理规范

1.1 Read/Write Enabled

1.2 Generate Mip Maps

1.3 Wrap Mode

1.3.1 选项作用

当图片被平铺 (Tiles) 显示时的处理方式,如何将图片进行平铺处理,UGUI中,Repeat 会在一个 Mesh 上进行平铺,而 Clamp 会生成很多个 Mesh

1.3.2 建议

图片缩小显示时,Repeat 采样会导致边缘有错误,此时应该设置为 Clamp,其它情况建议设置为 Repeat,UGUI 的 Image 组件在被设置成 Tiled 时会提示建议设置为 Repeat 。

1.4 sRGB
1.4.1 选项作用

这关于 Gamma 空间和线性空间的问题,sRGB 是告诉系统你的图片是否在 sRGB 空间下制作的,当你在线性空间下绘制时,你需要告诉 GPU 这个图片是在 sRGB 空间下制作的,GPU 不会再进行 Gamma 校正。

1.4.2 建议

当你的项目位于 Gamma 空间时,这个设置是否勾选没有区别。
当你的项目位于线性空间时,需要设计师告诉你这个图片是否在 sRGB 空间下制作,以此确定是否勾选 sRGB 选项

1.5 纹理压缩格式

1.5.1 选项作用

不同平台的纹理压缩选项,关系到该平台构建出的安装包大小和纹理的内存大小。可以参考图片和纹理

1.5.2 建议

2. 模型Model标签

2.1 Read/Write Enabled

2.1.1 选项作用

和纹理的 Read/Write Enabled 类似,额外占用内存,只有当你需要针对模型数据进行修改和读取时才应该开启,一个案例是当你的 ParticleSystem 中使用 Mesh 来当做 Renderer 时,该 Mesh 对应的模型应该要开启 Read/Write Enabled

2.1.2 建议

被当做粒子系统的 Renderer 时开启,其它情况关闭

2.2 Optimize Mesh

2.2.1 选项作用

开启后,模型顶点会被以更优的方式排序,GPU性能得到提升

2.2.2 建议

总是开启

2.3 Normals & Tangents

2.3.1 选项意义

模型文件中存储的顶点法线和切线数据

2.3.2 建议

如果你的材质中并没有使用法线或切线数据,应该把它去掉,选择选项 None

2.4 冗余的 UV2/Color 等信息
2.4.1 意义

这部分数据的选项并没有暴露在 Inspector 视图中,模型导出时可能会带上 UV2/Color 等信息,如果你的材质中没有使用,那么会造成冗余

2.4.2 建议

在确保材质没有使用冗余属性的前提下,去掉它们

3.模型 Rig 标签

3.1 Animation Type

3.1.1 选项意义

动画类型 Generic 和 Humanoid,Humanoid 有更好的重定向特性,Generic 有更好的效率和内存优势

3.1.2 建议

根据实际情况选择

3.2 Optimize GameObject

3.2.1 选项意义

在运行时不暴露骨骼节点,少了很多 Transform 组件,大大提高了 AnimatorUpdate 的效率。如果有挂节点需要暴露,可以添加到 Extra Transforms To Expose 列表中

3.2.2 建议

总是勾选

4. 模型 Animation 标签

4.1 Import Animation Type

4.1.1 选项意义

是否将模型中的动画导入,有些模型只应提供网格,动画另外导入,这种时候不要勾选避免导入额外的动画。

4.1.2 建议

看具体情况,如果本身是需要导入动画的就勾选。

4.2 Resample Curves

4.2.1 选项意义

将动画中的 Euler 数据转换为 Quaternion,动画更新时使用 Quaternion,减少了计算转换,插值更平滑,较少的性能提升,10%-20%左右的内存增加

4.2.2 建议

通常情况下不要勾选

4.3Anim.Compress

4.3.1 选项意义

根据一定策略进行动画压缩。

4.3.2 建议

一般选择 Optimal 压缩,设置合适的 Position/Rotation/Scale Error 值,值越大动画误差越大,需要取经验值。

4.4 Scale 曲线剔除

4.4.1 意义

并没有暴露到选项里,角色骨骼动画由 Rotation/Position/Scale 曲线构成,大多情况下 Scale 曲线不会变化,因为角色动画很少做缩放,Scale 曲线可以考虑去掉,减少文件和内存大小。

4.4.2 建议

在资源导入脚本中加逻辑去掉 Scale 曲线,若某个动画对 Scale 曲线进行了操作,在文件命名上高速脚本,跳过处理

4.5 动画数据浮点数精度压缩

4.4.1 意义

当浮点数精度超过3位时,绝大部分人眼感知不到差别,过高的浮点数精度造成了存储上的浪费

4.4.2 建议

在资源导入脚本中加逻辑去进行浮点数精度的压缩。

5. 粒子系统 ParticleSystem

5.1 不能随便指定材质 Shader

5.1.1 意义

Shader 的滥用可能会导致你的粒子材质使用了很复杂的 Shader,造成渲染性能的损耗。

5.1.2 建议

维护一个 Shader 列表,粒子系统使用的材质只能选择列表中的材质,检查脚本触发时扫描 ParticleSystem 预设的材质是否引用了名单外的 Shader,把错误报告出来

5.2 限制粒子所用贴图的大小

5.2.1 意义

粒子中的贴图精度一般要求不高,256x256 已经足够用了。

5.2.2 建议

粒子引用的贴图尽量小,不要超过 256x256

5.3 限制粒子所引用模型的参数

5.2.2 意义

当粒子的 Render-Render Mode 选择 Mesh 时,对应的网格应该勾选 Read/Write Enabled,否则渲染出错,粒子中渲染 Mesh 的消耗较高,所以需要控制 Mesh 的面数和个数

5.2.3 建议

被用到粒子系统中的 Mesh,勾选 Read/Write Enabled,单个面数不要超过 500,粒子系统不要发射超过 5 个Mesh

5.4 未激活的粒子必须删除

5.4.1 意义

粒子未激活,但它引用的材质、Shader、Mesh 和贴图都会被构建到安装包,并且被加载到内存

5.4.2 建议

检查脚本中将未激活的粒子,删除掉。

5.5 去掉冗余的序列化信息

5.5.1 意义

这里其实是 Unity 的序列化机制的问题。当你选择粒子的 RenderMode 为 Mesh 并且指定为 Mesh 之后,修改了 RenderMode 为其它方式(Billboard),之前引用的 Mesh 依然被该粒子引用(查看 .meta 文件可以确定),导致本不应该的构建和加载。

在材质球中选择某个 Shader 并指定纹理,然后替换其它 Shader,材质依然引用了之前的问题,这也是一个同样的问题。

5.5.2 建议

检查脚本中去掉冗余资源引用。

上一篇 下一篇

猜你喜欢

热点阅读