はじめに
AssetPostprocessorを継承し、OnPostprocessAllAssetsを実装すると、
Assets内でファイルが追加、変更、削除、移動される度に実行されるようになります。
この時、その状態が変わったファイルが
特定のディレクトリ以下であるかを知りたい場合があると思います。
「〇〇というディレクトリにファイルが"追加"された時」等、
特定のディレクトリが一つかつ状態が一つであれば、
以下のように判定できます。
foreach (string asset in importedAssets) { //SETTING_SCENE_DIRECTORY_PATH以下にあるシーンが更新された時だけアセットデータを作成 //更新されたファイルのディレクトリ名で判定 string directoryName = System.IO.Path.GetDirectoryName (asset); if(directoryName == SETTING_SCENE_DIRECTORY_PATH){ //シーン名は更新されたファイル名から取得 string sceneName = System.IO.Path.GetFileNameWithoutExtension (asset); Create (sceneName); } }
しかし、判定したいディレクトリや状態が増えると煩雑になってしまいそうです。
そこで、LINQを使って簡潔に判定するメソッドを作ってみました。
AssetPostprocessorEx
使用頻度が高そうなので、AssetPostprocessorを継承したAssetPostprocessorExを作成し、
そこに判定用メソッドを作成してみました。
これを継承し、ExistsDirectoryInAssetsを使えば簡単に判定を行う事が出来ます。
使用例
Assets/Resources/AudioまたはAssets/Resources/Imageのディレクトリにあるファイルが
変更(追加)または削除された場合のコードは以下のようになります。
using System; using System.IO; using System.Text; using UnityEditor; using UnityEditorInternal; using UnityEngine; using System.Collections.Generic; public class AssetPostprocessorExExample : AssetPostprocessorEx{ private static void OnPostprocessAllAssets (string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { List<string[]> assetsList = new List<string[]> (){ importedAssets, deletedAssets, }; List<string> targetDirectoryNameList = new List<string> (){ "Assets/Resources/Audio", "Assets/Resources/Image" }; if(ExistsDirectoryInAssets(assetsList, targetDirectoryNameList)){ //該当するファイルがあった場合の処理 } } }
これをEditor以下に置けば動作するようになります。
なお、
- importedAssetsが追加、変更されたファイル
- deletedAssetsが削除されたファイル
- movedAssetsが移動したファイル(移動先)
- movedFromAssetPathsが移動したファイル(移動元)
となります。