はじめに
今回はAssetPosprocessor
を利用してアセットをインポートした前後に処理を走らせてみる記事になります。
使い方
以下のコードをEditor
フォルダ(厳密にはアセンブリがEditorのみであればOK)に入れます。
public class AssetPostProcessorSample : AssetPostprocessor { // アセットをインポートする前に呼び出される private void OnPreprocessAsset() { } // 全てのアセットのインポートが完了した後に呼び出される private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { } }
AssetPostprocessor
を継承した後、指定の関数を定義すればアセットのインポート処理前後に呼び出されます。
関数一覧
公式ドキュメントには以下の関数が載っていました。
Postprocess
- OnAssignMaterialModel
- OnPostprocessAllAssets
- OnPostprocessAnimation
- OnPostprocessAssetbundleNameChanged
- OnPostprocessAudio
- OnPostprocessCubemap
- OnPostprocessGameObjectWithUserProperties
- OnPostprocessMaterial
- OnPostprocessMeshHierarchy
- OnPostprocessModel
- OnPostprocessPrefab
- OnPostprocessSpeedTree
- OnPostprocessSprites
- OnPostprocessTexture
- OnPostprocessTexture2DArray
- OnPostprocessTexture3D
Preprocess
- OnPreprocessAnimation
- OnPreprocessAsset
- OnPreprocessAudio
- OnPreprocessCameraDescription
- OnPreprocessLightDescription
- OnPreprocessMaterialDescription
- OnPreprocessModel
- OnPreprocessSpeedTree
- OnPreprocessTexture
応用例
特定のフォルダにファイルが追加・削除されたときに操作を行う
例えば特定のフォルダの中にファイルをインポートした際に、設定ファイルを自動で更新してあげるといった利用方法が考えられます。
public class MyAssetPostprocessor : AssetPostprocessor { private const string TargetFolder = "Assets/StreamingAssets/"; /// <summary> /// 全てのアセットのインポートが完了した後に呼び出される /// </summary> private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { if (importedAssets.Length == 0 && deletedAssets.Length == 0 && movedAssets.Length == 0) return; var doUpdate = importedAssets.Concat(deletedAssets).Concat(movedAssets).Any(x => x.Contains(TargetFolder)); if(doUpdate) UpdateSetting(); } private static void UpdateSetting(){} }
一応System.IO.Path.GetDirectoryName
を利用してフォルダ名で判断する方法もあるそうですが、単純にパスを見て判断でも悪くはない気がします。
Textureをインポートした際に設定を書き換える
UnityEditor.AssetPostprocessor.assetImporter
(インポートしようとしているAssetImporterの参照)を利用することで、インポートしたテクスチャの設定を変更することができます。
public class TextureImporter : AssetPostprocessor { private void OnPreprocessTexture() { // AssetImporterをTextureImporterにキャスト var importer = (UnityEditor.TextureImporter)assetImporter; // TextureTypeをスプライトに変更 importer.textureType = TextureImporterType.Sprite; // MaxTextureSizeを512x512に変更 importer.maxTextureSize = 512; // FilterModeをPointに変更 importer.filterMode = FilterMode.Point; } }
どんな変数があるかは以下のリファレンスを参照してください。
UnityEditor.TextureImporter - Unity スクリプトリファレンス