うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】アセット管理を効率化するためのガイド: AssetPostprocessorとAssetModificationProcessorの活用方法

Unityの開発過程において、アセットのインポートパイプラインをカスタマイズすることは、効率的なアセット管理に不可欠です。このカスタマイズを行うための主なツールは「AssetPostprocessor」と「AssetModificationProcessor」です。

AssetPostprocessorの概要

AssetPostprocessorは、アセットがインポートされた際に特定の処理を実行するために用いられます。これにより、アセットのインポートプロセスをフックし、必要な操作を自動化することができます。

主なメソッド

この表は、AssetPostprocessorを使用して、特定のアセットタイプのインポート処理をカスタマイズする際に役立ちます。それぞれのメソッドがどのようなタイミングで呼び出されるかを理解することで、より効果的なアセット管理が可能になります。

メソッド名 説明
OnPostprocessAllAssets すべてのアセットに共通して行う処理を定義する
OnAssignMaterialModel ソースマテリアルの設定を行う
OnPostprocessAssetbundleNameChanged アセットが他のアセットバンドルに指定された時に呼び出される
OnPostprocessAudio オーディオクリップのインポート完了時に通知される
OnPostprocessCubemap キューブマップテクスチャのインポート完了直前に通知される
OnPostprocessGameObjectWithUserProperties ユーザープロパティが付けられたゲームオブジェクトのインポート時に呼び出される
OnPostprocessMaterial マテリアルアセットのインポート完了時に通知される
OnPostprocessModel モデルのインポート完了時に通知される
OnPostprocessSpeedTree SpeedTreeアセットのインポート完了時に通知される
OnPostprocessSprites スプライトテクスチャのインポート完了時に通知される
OnPostprocessTexture テクスチャのインポート完了直前に通知される
OnPreprocessAnimation アニメーションのインポート直前に通知される
OnPreprocessAsset 任意のアセットのインポート直前に通知される
OnPreprocessAudio オーディオクリップのインポート直前に通知される
OnPreprocessModel モデルのインポート直前に通知される
OnPreprocessSpeedTree SpeedTreeアセットのインポート直前に通知される
OnPreprocessTexture テクスチャインポーター実行前に通知される

サンプル

using UnityEngine;
using UnityEditor;

public class MyAssetPostprocessor : AssetPostprocessor
{
    void OnPreprocessTexture()
    {
        if (assetPath.Contains("SomeSpecificFolder"))
        {
            TextureImporter textureImporter = (TextureImporter)assetImporter;
            textureImporter.textureCompression = TextureImporterCompression.Uncompressed;
        }
    }

    static void OnPostprocessAllAssets(
        string[] importedAssets, string[] deletedAssets, 
        string[] movedAssets, string[] movedFromAssetPaths)
    {
        foreach (string str in importedAssets)
        {
            Debug.Log("Asset Imported: " + str);
        }
    }
}

このサンプルでは、特定のフォルダ内のテクスチャの圧縮設定を変更し、インポートされたアセットのパスをログに出力しています。

AssetModificationProcessorの概要

Unityのエディタ内でのアセットの管理と操作をより細かくコントロールするためには、「AssetModificationProcessor」が重要な役割を果たします。このクラスは、アセットの作成、削除、移動、保存などのイベントに対してカスタム処理を実装することができます。これにより、開発プロセス中にアセットに対する特定の操作が行われる際に、追加の処理や制約を設定することが可能となります。

主なメソッド

メソッド名 説明
OnWillCreateAsset アセットが作成される直前に呼び出される
OnWillDeleteAsset アセットが削除される直前に呼び出される
OnWillMoveAsset アセットが移動される直前に呼び出される
OnWillSaveAssets アセットが保存される直前に呼び出される
IsOpenForEdit アセットが編集可能かどうかを判断する
CanOpenForEdit アセットを編集するために開くことができるかどうかを判断する
StartAssetEditing アセットの編集セッションを開始する
EndAssetEditing アセットの編集セッションを終了する

AssetModificationProcessorは、Unityエディタ内でのアセットの変更や保存のプロセスをカスタマイズするために使用されます。これらのメソッドを使用して、特定のアセットの操作に特別な処理を追加したり、特定の条件下での操作を制限したりすることができます。例えば、アセットが削除される前に特定のクリーンアップ処理を実行する、または特定のアセットの編集を制限するなどのカスタマイズが可能です。

サンプル

using UnityEngine;
using UnityEditor;

public class MyAssetModificationProcessor : UnityEditor.AssetModificationProcessor
{
    public static string[] OnWillSaveAssets(string[] paths)
    {
        Debug.Log("Assets being saved:");
        foreach (string path in paths)
        {
            Debug.Log(path);
        }
        // ファイル保存の前に行いたい処理をここに記述
        return paths;
    }

    public static AssetDeleteResult OnWillDeleteAsset(string assetPath, RemoveAssetOptions option)
    {
        Debug.Log("Asset being deleted: " + assetPath);
        // アセット削除の前に行いたい処理をここに記述
        return AssetDeleteResult.DidNotDelete;
    }
}

このサンプルでは、アセットが保存または削除される前に、そのパスをログに出力しています。また、任意の追加処理を行うことも可能です。

リファレンス

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