【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方法。
都是猜想,也不知道對不對,等之後有時間會好好研究一下。