【Unity3D Editor】导入图片自动转换成Sprite

原文链接: 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方法,关于图片资源处理里有如下两个方法:

AssetPostprocessor.OnPostprocessTexture(Texture2D);
AssetPostprocessor.OnPreprocessTexture();
 
 
  • 1
  • 2
  • 1
  • 2

  针对于本案例来说,不管用哪个方法都能实现同样的效果,但为了区分两个方法,亦泽还是尝试去理解API给出的说明和案例。大致区分是这样的: 
  OnPostprocessTexture方法有Texture参数,其用来获取导入图片资源,可对图片属性进行处理,例如像素,色彩之类的处理,它执行在导入过程中(如果没理解错的话哈哈哈); 
  OnPreprocessTexture方法没有参数,它用来处理图片在Unity被管理的属性,比如图片要在Unity当中要应用的Texture类型、Sprite类型,改变这样的类型其实没对图片本身属性做任何修改,只是底层用一些我们看不到的代码对资源进行了包装和处理,使其在Unity中显示为正确的样式(png图片只有改成Sprite类型才能正确的应用透明通道)它执行在资源导入之前,即它没法获取到资源,只是先把资源属性设置好,等图片来了直接给图片套上就好。

实现代码如下:

using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.Collections;

public class TranserToSprite : AssetPostprocessor {

    void OnPreprocessTexture()
    {
        //为需要转换为Sprite类型的图片名称中加如@sprite,用作匹配
        //当匹配到含有@sprite串时才转换图片类型
        if (assetImporter.assetPath.Contains("@sprite"))
        {
            //texImpoter是图片的Import Settings对象
            //AssetImporter是TextureImporter的基类
            TextureImporter texImpoter = assetImporter as TextureImporter;
            //TextureImporterType是结构体,包含所有Texture Type
            texImpoter.textureType = TextureImporterType.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;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值