Unity 项目美术资源规范的一些建议
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 项目美术资源规范的一些建议相关的知识,希望对你有一定的参考价值。
参考技术A 在做 Unity 项目中,不可避免的要跟贴图、模型、动画等等美术资源打交道,一个完备合理的资源规范是很必要的,本文总结了一些我在项目中关于美术资源规范的的一些实践。当图片被平铺 (Tiles) 显示时的处理方式,如何将图片进行平铺处理,UGUI中,Repeat 会在一个 Mesh 上进行平铺,而 Clamp 会生成很多个 Mesh
图片缩小显示时,Repeat 采样会导致边缘有错误,此时应该设置为 Clamp,其它情况建议设置为 Repeat,UGUI 的 Image 组件在被设置成 Tiled 时会提示建议设置为 Repeat 。
这关于 Gamma 空间和线性空间的问题,sRGB 是告诉系统你的图片是否在 sRGB 空间下制作的,当你在线性空间下绘制时,你需要告诉 GPU 这个图片是在 sRGB 空间下制作的,GPU 不会再进行 Gamma 校正。
当你的项目位于 Gamma 空间时,这个设置是否勾选没有区别。
当你的项目位于线性空间时,需要设计师告诉你这个图片是否在 sRGB 空间下制作,以此确定是否勾选 sRGB 选项
不同平台的纹理压缩选项,关系到该平台构建出的安装包大小和纹理的内存大小。可以参考 图片和纹理
和纹理的 Read/Write Enabled 类似,额外占用内存,只有当你需要针对模型数据进行修改和读取时才应该开启,一个案例是当你的 ParticleSystem 中使用 Mesh 来当做 Renderer 时,该 Mesh 对应的模型应该要开启 Read/Write Enabled
被当做粒子系统的 Renderer 时开启,其它情况关闭
开启后,模型顶点会被以更优的方式排序,GPU性能得到提升
总是开启
模型文件中存储的顶点法线和切线数据
如果你的材质中并没有使用法线或切线数据,应该把它去掉,选择选项 None
这部分数据的选项并没有暴露在 Inspector 视图中,模型导出时可能会带上 UV2/Color 等信息,如果你的材质中没有使用,那么会造成冗余
在确保材质没有使用冗余属性的前提下,去掉它们
动画类型 Generic 和 Humanoid,Humanoid 有更好的重定向特性,Generic 有更好的效率和内存优势
根据实际情况选择
在运行时不暴露骨骼节点,少了很多 Transform 组件,大大提高了 AnimatorUpdate 的效率。如果有挂节点需要暴露,可以添加到 Extra Transforms To Expose 列表中
总是勾选
是否将模型中的动画导入,有些模型只应提供网格,动画另外导入,这种时候不要勾选避免导入额外的动画。
看具体情况,如果本身是需要导入动画的就勾选。
将动画中的 Euler 数据转换为 Quaternion,动画更新时使用 Quaternion,减少了计算转换,插值更平滑,较少的性能提升,10%-20%左右的内存增加
通常情况下不要勾选
根据一定策略进行动画压缩。
一般选择 Optimal 压缩,设置合适的 Position/Rotation/Scale Error 值,值越大动画误差越大,需要取经验值。
并没有暴露到选项里,角色骨骼动画由 Rotation/Position/Scale 曲线构成,大多情况下 Scale 曲线不会变化,因为角色动画很少做缩放,Scale 曲线可以考虑去掉,减少文件和内存大小。
在资源导入脚本中加逻辑去掉 Scale 曲线,若某个动画对 Scale 曲线进行了操作,在文件命名上高速脚本,跳过处理
当浮点数精度超过3位时,绝大部分人眼感知不到差别,过高的浮点数精度造成了存储上的浪费
在资源导入脚本中加逻辑去进行浮点数精度的压缩。
Shader 的滥用可能会导致你的粒子材质使用了很复杂的 Shader,造成渲染性能的损耗。
维护一个 Shader 列表,粒子系统使用的材质只能选择列表中的材质,检查脚本触发时扫描 ParticleSystem 预设的材质是否引用了名单外的 Shader,把错误报告出来
粒子中的贴图精度一般要求不高,256x256 已经足够用了。
粒子引用的贴图尽量小,不要超过 256x256
当粒子的 Render-Render Mode 选择 Mesh 时,对应的网格应该勾选 Read/Write Enabled,否则渲染出错,粒子中渲染 Mesh 的消耗较高,所以需要控制 Mesh 的面数和个数
被用到粒子系统中的 Mesh,勾选 Read/Write Enabled,单个面数不要超过 500,粒子系统不要发射超过 5 个Mesh
粒子未激活,但它引用的材质、Shader、Mesh 和贴图都会被构建到安装包,并且被加载到内存
检查脚本中将未激活的粒子,删除掉。
这里其实是 Unity 的序列化机制的问题。当你选择粒子的 RenderMode 为 Mesh 并且指定为 Mesh 之后,修改了 RenderMode 为其它方式(Billboard),之前引用的 Mesh 依然被该粒子引用(查看 .meta 文件可以确定),导致本不应该的构建和加载。
检查脚本中去掉冗余资源引用。
unity 美术注意事项
有时候美术的一个不小心,就会给程序徒增极大的工作量,所以在项目开始之前是有必要和美术沟通一下,来规范一些东西,
1、将单体模型的轴心置中。
2、模型有父物体时,子物体应相对于父物体的(0,0,0)位置建模,即父物体的位置最好是整个模型的中心点。
3、unity使用的是左手坐标系,模型的 z 轴正方向应为模型的正向,x轴正方向为右。
4、3D模型的大小以米为单位,如:房子的大小为3米,人物1.8米等。
5、贴图文件像素大小最好为2的n次方,unity3d中可识别的最大尺寸为4096*4096。
6、模型的名称,材质球的名称以及贴图的名称尽量不使用中文。
7、可以重复使用的物体只需要导出一个即可,然后在u3d中进行复制拼接即可。
8、模型的名称、材质球的名称以及贴图的名称需要一致,避免出现不必要的麻烦。
9、多张UI图片可以打包在一起,规则如下:
-
不用的图不打包。因为打包的图,就算从不使用,也还是会进入到最终的ipa或者apk里;
-
小的图尽可能打包
-
大图(比如大于512x512,常见的有UI底图、背景图)不打包。因为大图会很有可能产生透明区域;
-
降低需要打包中的分辨率最大的图
由于多张图片打包在了一起,根据上面提过的合并drawcall的原因,会大幅减少这些图片带来的GPU消耗。
打包之后,会产生多余的透明区域,所以打包可能带来的坏处就是增大了外存、内存。
10、unity引擎本身并没有具体的面数限制,按机器性能而定。
11、尽量减少材质球的数量,模型尽量使用同样的材质和贴图。
12、现在的图形显卡可以很好的支持很多的多边形,但如果你有一个有100个三角形的MESH,它渲染起来所需要花费的运算跟1500个面数的物体是没有多大差别的。因此最佳的渲染设置时每个模型大约1500-4000个三角面。
13、只有在游戏组件中的属性栏中勾选Mesh Renderer选项显卡才会渲染相应的模型,并且在场景中的空的GameObject组件是不会被渲染的。
以上是关于Unity 项目美术资源规范的一些建议的主要内容,如果未能解决你的问题,请参考以下文章