我們有時候需要在導入資源的時候做一些自動化處理,比如導入圖片自動設置壓縮格式等,此時我們就需要使用AssetPostprocessor這個類了。
AssetPostprocessor 資源處理器
Unity盛典說明:http://www.ceeger.com/Script/AssetPostprocessor/AssetPostprocessor.html
這是一個編輯器類,如果想使用它你需要把它放到工程目錄下的Assets/Editor文件夾下。編輯器類在UnityEditor命名空間下。所以當使用C#腳本時,你需要在腳本前面加上 "using UnityEditor"引用
它是資源導入的一個管理器,在資源導入之前和之後可以根據導入的資源做一些設置和一些數據的修改,比如網格,紋理的壓縮,模型添加組件等。當資源導入之前和之後都會發送通知,可以根據不同的資源類型,在導入之前和之後做不同的處理。
OnPreprocessTexture
在子類中重載這個函數以便在紋理導入器運行之前獲取通知
OnPostprocessTexture
在子類中加入這個函數,以便在紋理載入存入磁盤之前獲得一個通知。
OnPreprocessModel
在子類中加入這個函數,以便在模型載入之前獲得一個通知。
OnPostprocessModel
在子類中加入這個函數,以便在模型載入之後獲得一個通知。
OnPostprocessGameObjectW...
在導入文件中,爲每個至少附加了一個用戶屬性的遊戲物體調用。
OnAssignMaterialModel
獲取一個源材質
OnPostprocessAudio
在子類中加入這個函數,以便在一個聲音剪輯載入後獲得一個通知。
OnPreprocessAudio
在子類中加入這個函數,以便在一個聲音剪輯載入之前獲得一個通知。
OnPostprocessAllAssets
在一些資源被導入後調用(當資源進度條到達末端)
例子
using UnityEngine;
using System.Collections;
using UnityEditor;
public class MyEditor : AssetPostprocessor {
//模型導入之前調用
public void OnPreprocessModel()
{
Debug.Log ("OnPreprocessModel="+this.assetPath);
}
//模型導入之前調用
public void OnPostprocessModel(GameObject go)
{
Debug.Log ("OnPostprocessModel="+go.name);
}
//紋理導入之前調用,針對入到的紋理進行設置
public void OnPreprocessTexture()
{
Debug.Log ("OnPreProcessTexture="+this.assetPath);
TextureImporter impor = this.assetImporter as TextureImporter;
impor.textureFormat = TextureImporterFormat.ARGB32;
impor.maxTextureSize = 512;
impor.textureType = TextureImporterType.Advanced;
impor.mipmapEnabled = false;
}
public void OnPostprocessTexture(Texture2D tex)
{
Debug.Log ("OnPostProcessTexture="+this.assetPath);
}
public void OnPostprocessAudio(AudioClip clip)
{
}
public void OnPreprocessAudio()
{
AudioImporter audio = this.assetImporter as AudioImporter;
audio.format = AudioImporterFormat.Compressed;
}
//所有的資源的導入,刪除,移動,都會調用此方法,注意,這個方法是static的
public static void OnPostprocessAllAssets(string[]importedAsset,string[] deletedAssets,string[] movedAssets,string[]movedFromAssetPaths)
{
Debug.Log ("OnPostprocessAllAssets");
foreach (string str in importedAsset) {
Debug.Log("importedAsset = "+str);
}
foreach (string str in deletedAssets) {
Debug.Log("deletedAssets = "+str);
}
foreach (string str in movedAssets) {
Debug.Log("movedAssets = "+str);
}
foreach (string str in movedFromAssetPaths) {
Debug.Log("movedFromAssetPaths = "+str);
}
}
}