1. 程式人生 > >【Unity3D Editor】匯入圖片自動轉換成Sprite

【Unity3D Editor】匯入圖片自動轉換成Sprite

【需求】

  這幾天做專案時,意識到要用到大量的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();

  針對於本案例來說,不管用哪個方法都能實現同樣的效果,但為了區分兩個方法,亦澤還是嘗試去理解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、沒找到圖片屬性正好契合了對OnPreprocessTexture方法執行在匯入資源之前的解讀;
  2、那是如何獲取資源路徑的呢?猜想是當有資源要匯入時,根據使用者拖拽和資源名稱,預先生成一個唯一路徑,如果存在相同路徑編輯器會為資源更改名稱(這個倒是真的),這應該是匯入資源時最先觸發的事件,然後是OnPreprocessTexture方法,然後是OnPostprocessTexture方法。
  都是猜想,也不知道對不對,等之後有時間會好好研究一下。

【參考資料】