MRが楽しい

MRやVRについて学習したことを書き残す

Unityでアセット読み込みが完了したタイミングを通知する

本日はUnityの小ネタ枠です。
Unityでアセット読み込みが完了したタイミングを通知する方法についてです。

アセット読み込みが完了したタイミングを通知する

AssetPostprocessorクラスのOnPostprocessAllAssetsメソッドを利用してアセット読み込みの完了通知を受け取ることができます。
OnPostprocessAllAssetsは任意のアセットのインポートが完了した後 (アセットの進行状況バーが終了したとき) に呼び出されます。
docs.unity3d.com
docs.unity3d.com

本呼び出しはプロジェクトにアセットをインポートしたとき、新しい場所に移動したとき、更新したときに発生する可能性があります。
アセットのインポートを完了したときに呼び出されるので、本コールバックを利用することでアセット関連の操作を安全に行えます。
引数にはAssetsフォルダーを基準とした相対ファイルパスが含まれています。

サンプルスクリプト

以下のサンプルスクリプトをプロジェクトに配置してログを確認してみました。
・OnPostprocessAllAssetsTest.cs

using UnityEngine;
using UnityEditor;

class OnPostprocessAllAssetsTest : AssetPostprocessor
{
    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths, bool didDomainReload)
    {
        foreach (string str in importedAssets)
        {
            Debug.Log("Reimported Asset: " + str);
        }
        foreach (string str in deletedAssets)
        {
            Debug.Log("Deleted Asset: " + str);
        }

        for (int i = 0; i < movedAssets.Length; i++)
        {
            Debug.Log("Moved Asset: " + movedAssets[i] + " from: " + movedFromAssetPaths[i]);
        }

        if (didDomainReload)
        {
            Debug.Log("Domain has been reloaded");
        }
    }
}


アセットを作成/更新した場合

アセットを作成/更新すると、importedAssets引数に対象のパスが引き渡されます。

アセットを削除した場合

アセットを削除すると、deletedAssets引数に対象のパスが引き渡されます。

アセットを移動した場合

アセットを移動すると、movedAssets引数に対象の移動先のパス、movedFromAssetPaths引数に移動元のパスが引き渡されます。

そのほか

なおアセットの更新がなかったとき(プロジェクトを開きなおしたとき)にも通知は発生します。

複数のアセットの更新が走った場合は全ての読み込みが完了してから通知が発生します。