【Unity】把美术导入的动画和模型自动生成为程序所需要的预制体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Unity】把美术导入的动画和模型自动生成为程序所需要的预制体相关的知识,希望对你有一定的参考价值。

参考技术A 美术导入的资源格式千奇百怪,我们程序需要的预制体一般为标准格式,比如模型放一层,物理放一层,脚本放一层。所以我们需要手动设置一次结构,我做了个自动化工具就可以一键设置好结构了

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】把美术导入的动画和模型自动生成为程序所需要的预制体的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D之Mecanim动画系统学习笔记:模型导入

maya动画导入unity怎么播放

MAX 动画 导入 Unity 3D 的问题

怎么把3Dmax里面做的动画在unity中实现

unity3d怎么把动画导入模型?

unity2d之2d帧动画创建