原文链接: http://blog.csdn.net/eazey_wj/article/details/61287214
【需求】
这几天做项目时,意识到要用到大量的UI素材,图片资源导入Unity时,其Texture Type属性默认为Texture,而UGUI系统需要的图片素材是Sprite类型,显然当有新的图片资源导入工程时要不断地修改类型再点个Apply按钮,相对来说还是比较麻烦的,怎样才能导入图片后直接设置图片类型为Sprite类型呢?
【方案】
方案一:
Edit->Project Settings->Editor,将Default Behavior Mode设置成2D模式,这样拖入工程的图片会自动变换为Sprite类型。
方案一是不是跑题了哈哈哈哈。这的确是个可行的办法,尤其是只需要用到UGUI系统或者做2D产品的时候,直接将工程设置2D模式是最简单的办法。but。。。那么多类型呢,怎么可能只用到Sprite类型呢?显然上述的设置方法不够通用,甚至在做非纯2D项目时,来回切换编辑器模式显然很烦。那咋整?是时候写个编辑器脚本了!
方案二:
查了下相关API,发现了AssetPostprocessor类,官方API给出的解释由于亦泽英文太渣也没能太好的翻译,不过从大致意思和实际使用来看,这个类用于在资源导入之前与导入之后处理资源,(这里理解的可能不到位,也是第一次使用该类,如果偏差过大请留言或私信批评指正)该类有很多Message方法,关于图片资源处理里有如下两个方法:
- 1
- 2
- 1
- 2
针对于本案例来说,不管用哪个方法都能实现同样的效果,但为了区分两个方法,亦泽还是尝试去理解API给出的说明和案例。大致区分是这样的:
OnPostprocessTexture方法有Texture参数,其用来获取导入图片资源,可对图片属性进行处理,例如像素,色彩之类的处理,它执行在导入过程中(如果没理解错的话哈哈哈);
OnPreprocessTexture方法没有参数,它用来处理图片在Unity被管理的属性,比如图片要在Unity当中要应用的Texture类型、Sprite类型,改变这样的类型其实没对图片本身属性做任何修改,只是底层用一些我们看不到的代码对资源进行了包装和处理,使其在Unity中显示为正确的样式(png图片只有改成Sprite类型才能正确的应用透明通道)它执行在资源导入之前,即它没法获取到资源,只是先把资源属性设置好,等图片来了直接给图片套上就好。
实现代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
【猜想】
对没找到名称属性和可以直接应用路径属性做如下猜想:
1、没找到图片属性正好契合了对OnPreprocessTexture方法执行在导入资源之前的解读;
2、那是如何获取资源路径的呢?猜想是当有资源要导入时,根据用户拖拽和资源名称,预先生成一个唯一路径,如果存在相同路径编辑器会为资源更改名称(这个倒是真的),这应该是导入资源时最先触发的事件,然后是OnPreprocessTexture方法,然后是OnPostprocessTexture方法。
都是猜想,也不知道对不对,等之后有时间会好好研究一下。
【参考资料】
Unity-Script AssetPostprocessor
最后说一点:
对于本人的项目,由于没有统一的命名规则,所有要把“@sprite”修改为“.png”。
这样在导入的时候,就会自动的把图片修改为unity的sprite了
17年4月28日更改,增加两行代码,用来设置sprite的属性:
texImporter.textureFormat = TextureImporterFormat.AutomaticTruecolor;
texImporter.maxTextureSize = 256;