はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】AssetPostprocessorを利用してアセットをインポートした前後に処理を走らせる

はじめに

今回はAssetPosprocessorを利用してアセットをインポートした前後に処理を走らせてみる記事になります。

docs.unity3d.com

使い方

以下のコードを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

UnityEditor.AssetPostprocessor - Unity スクリプトリファレンス

Preprocess
  • OnPreprocessAnimation
  • OnPreprocessAsset
  • OnPreprocessAudio
  • OnPreprocessCameraDescription
  • OnPreprocessLightDescription
  • OnPreprocessMaterialDescription
  • OnPreprocessModel
  • OnPreprocessSpeedTree
  • OnPreprocessTexture

UnityEditor.AssetPostprocessor - Unity スクリプトリファレンス

応用例

特定のフォルダにファイルが追加・削除されたときに操作を行う

例えば特定のフォルダの中にファイルをインポートした際に、設定ファイルを自動で更新してあげるといった利用方法が考えられます。

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の参照)を利用することで、インポートしたテクスチャの設定を変更することができます。

docs.unity3d.com

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 スクリプトリファレンス