Unity3D – 图片资源导入的一些基础知识

在Unity里,选中导入的资源后,在Inspector窗口的下方会出现资源的预览和资源的大小格式等相关信息。

很多人在导入资源后会有这样的疑问

我的资源怎么变大了?
我修改了资源大小,怎么导入的资源大小没有发生变化?
有些资源提示不能压缩是怎么回事,我的资源不就是压缩过的吗?
其实一句话就可以解释这些现象:你导入的资源,并不是Unity使用的资源。

在你导入资源时,一般会需要等待一段时间,这时Unity实际上在进行资源的格式转换。你所导入的”.png”和”.fbx”等资源,Unity并不会直接使用,而是转为一种Unity内部的格式。当时在Unity的编辑器下使用这些资源文件时,Unity会使用其生成的内部文件,而不是你所选择或者拖动的文件。

在你选择资源文件时,Inspector下的预览窗口显示的也就是其生成的文件的预览。当你将一个进行过压缩的文件格式导入Unity时,实际上Unity会先读取其数据然后生成自己对应的压缩格式。如果将同一个图片保存为png和jpg两种格式,你会发现导入Unity后预览窗口的大小格式等是完全一样的。对于音频格式也是如此,相同采样率的mp3和wav,导入后的大小也是完全一样。

这也解释了在某些时候,导入一个不压缩的大文件会比导入一个压缩过的小文件更加快速的原因——非压缩文件分析起来更加迅速。

也正因为如此,在资源的制作上,没必要限制美工或音效的文件大小,也没必要要求将图片存为png或jpg等压缩格式,因为这些工作,在Unity里 没 卵 用。

那么对于图片资源,我们应该如何去处理和优化工作流程呢?

图片资源的分类
在Unity中,图片一般可以分为两种:贴图(Texture)和精灵(Sprite)。我们可以简单的理解为3D(模型使用的)图片和2D(UI使用的)图片。在可以直接选择Texture Type去更改你的导入方式。

Texture
Texture一般作为3D模型上的贴图,需要有对应的材质球并关联到相应3D网格模型去使用。一般来说Texture会是一个长宽像素都是2的n次方的正方形,这也是大部分建模软件(如maya)规定的POT(Power Of Tow)。
不过并不是说非POT图片就不能使用,只是在Unity的压缩上会很吃亏,而且你导入后Unity仍然会以POT方式去生成对应的图片。
POT实际上可以是长方形,只要长宽都是POT就可以,但是大部分建模软件上都会使用正方形。
Sprite
Sprite一般作为UI上的图片,一般不会去制作对应的材质球。在UGUI上一般是拖动到相应的控件上就可以了。
Sprite是一个资源导入的方式,一个资源导入后并非只能是单个Sprite,在Sprite Mode选项上可以选择Multiple去生成多个Sprite,不过需要在Sprite Editor选项上对图片进行切割,通常需要美术参与。
Sprite一般对大小不会做限制,UI需要多大就用多大,但是Unity在压缩上,对4的倍数分辨率的图片支持上会更好一点(应该是方便图片在POT下的位置计算),所以在制作时可以对PS的画布大小进行适当调整。
Sprite在导入设置完成后建议使用 Sprite Packer 进行打包,如果你确定不打包。。。那么建议你做成POT。。。
在使用 Sprite Packer 打包图集后你会发现,Unity生成的图片都是POT的。
MiniMap
图片资源在导入为Sprite后,我们可以看到一个MiniMap选项,该选项是生成该图片的低分辨图片(1/2,1/4,1/8。。。),这些小图会使生成的资源文件变大1/3,但是在3D渲染时Unity会根据物体显示的大小(或者距离?)自动选择不同的分辨率以提高渲染效率。
一般来说,Sprite不会有这种需求,所以关闭这个选项可以减少包体的大小。

而对于Texture,同样可以取消。Texture和Sprite实际上只是Unity的两种预设,当你在Texture Mode上选择Advance时,你会有很完全的导入选项。如果你确定你的3D物体不会有很多的远近变化时,选择Advance,取消MiniMap会是一个很正确的选择。而对于一般的3D物体,MiniMap带来的效率提高是值得你和用户去花费这点储存空间的。

资源的源文件格式
既然Unity可以使用PSD,那么你何必让美术去导出png呢?
PSD在导入速度上不比png和jpg慢(理论上应该会快,没测试),不过文件大小确实会变大。但是如果直接使用PSD,并要求美术直接在项目目录里进行资源管理和维护,实际上是在团队流程中省出了所有不必要的压缩格式文件(再次强调,导入资源使用的文件大小并不会影响最终的包体大小 )。
当然如果经常出现美术破坏项目目录结构的情况(上传非必要文件,命名不规范等),还是把文件发给程序比较好,而这种情况使用psd还是png那就见仁见智了,psd没有预览还是很难受的。(一般程序猿学PSD的基本操作比美术学SVN或者Unity都要快的多)

Sprite Packer + AssetBundle的注意事项

当你在使用AssetBundle时,你的Sprite引用实际上是Sprite Packer生成的图集的引用。所以在AssetBundle上,即便你只使用到一个图集中的一个小像素,Unity也会将该图集完整地打入AssetBundle中。所以Sprite尽量在Bundle的分包基础上去分图集。

图片导入unity,选择图片类型,取消Generate Mip Maps,为什么要取消呢,看下面:

如果勾选,unity会根据相机距离对象距离,生成8个Mip,该做法在3D场景UI是很好的做法,如果UI都在平面就暴露出了它的弊端,因为都在平面,所以不会有距离相机距离的变化,勾选就行,不然会增加一倍的内存,切记。

Filiter Mode 过滤模式,point 点模式:被拉伸时纹理成块状,Bilinear 双线性 :被拉伸时成模糊状,Thilinear: 三线性:介于上方两种之间。

各个平台的尺寸和格式的设置
MaxSize 该纹理的最大尺寸,如原图尺寸为1024*568,该项设置成4096,unity也只会使用它的原尺寸大小,改值的大小大于等于图片原尺寸,如果小于该纹理质量会有损失。

Format 格式设置

Compressed 压缩格式,如果纹理没有透明通道,一般使用该项,优化内存量,如果有透明通道,显示原图片有可能出现问题。4位
16bit 低质量真彩格式。16位
TrueColor 真彩模式。质量最高,是压缩格式的8倍,但也更消耗内存,32位
Crunched 这种类型将会根据显卡的GPU来选择合适的压缩格式进行压缩然后会选用一种CPU上就能处理的压缩格式再压缩一遍。如果在制作供人下载的资源包的时候这种类型非常的合适。这个类型的压缩需要很长时间,但在运行时解压是非常快的。
还要提醒的就是,图片的的大小一定要是2的幂次方,这样unity才能压缩成比较小的图片格式,如:etc、pvrtc等。

如果原图不是2的幂次方,可以在advance设置Non Power of 2值,

ToNearest :转换成距离该图片最近的2的幂次方值。
ToLarger : 转换成比该图片大的2的幂次方值。
ToSmaller : 转换成比该图片小的2的幂次方值。


发表评论