読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

任意のディレクトリにあるファイルが変更された時に処理を行う【Unity】【エディタ拡張】【LINQ】

Unity エディタ拡張 LINQ

このエントリーをはてなブックマークに追加

はじめに

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が移動したファイル(移動元)

となります。