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

(:3[kanのメモ帳]

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

OnPreprocessTextureなどをディレクトリ移動時も実行する【Unity】【エディタ拡張】


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

この記事でのバージョン
Unity 5.3.4f1 Personal


はじめに

OnPreprocessTextureはテクスチャがインポートされた時に実行され、

何かしらの処理を自動で行えるメソッドです。

同じようなものにOnPreprocessAudio、OnPreprocessModelがあります。

using UnityEngine;
using UnityEditor;

//AssetPostprocessorを継承する必要あり
public sealed class TexturePostprocessor : AssetPostprocessor{

  //Textureファイルのインポート設定 Textureファイルがインポートされる直前に呼び出される
  private void OnPreprocessTexture (){

    //インポート時のTextureファイルを設定するクラス
    TextureImporter textureImporter = assetImporter as TextureImporter;

    //インポートされたテクスチャのタイプをSpriteにしたりとか出来る
    textureImporter.textureType = TextureImporterType.Sprite;
  }

}


これは非常に便利なのですが、インポート時に実行されるメソッドなため、

ディレクトリを移動した時には実行されません。


インポート時のみの設定であればこれで十分なのですが、

例えば、ディレクトリ毎にテクスチャの設定を変えたい

なんて場合にはディレクトリを移動した時にもTextureImporterを実行して欲しくなります。


今回はそんな時に使える方法のご紹介です。


OnPostprocessAllAssets

今回使うのがOnPostprocessAllAssetsというメソッドです。

これはファイルがインポートされた時、削除された時、編集された時、移動した時と、

とにかく何らかの変更があった時に呼ばれるメソッドです。


これを利用して、ファイルが移動した時にそのファイルを再度インポートすれば、

ファイルが移動した時でもOnPreprocessTextureが呼ばれるようにできます。

例えば以下のような感じです。

using UnityEngine;
using UnityEditor;

//AssetPostprocessorを継承する必要あり
public sealed class TexturePostprocessor : AssetPostprocessor{

 //ファイルに何らかの変更があった時に呼ばれる
  private static void OnPostprocessAllAssets (string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths){

    //移動したアセット、全てのパスを回す
    foreach (string path in movedAssets) {
      //再度インポート
      AssetDatabase.ImportAsset (path, ImportAssetOptions.ForceUpdate);
    }

  } 

}


上記の例ではファイルが移動する度にインポートが発生してしまい、

さすがに煩わしいので、対象のディレクトリを指定し、

ついでにディレクトリによってフォーマットを自動で変えると以下のような感じに。



んで、これをEditorディレクトリに入れて置くとこうなる。


f:id:kan_kikuchi:20160421064156g:plain


設定ミスが無くなりそうでいい感じ!

まぁ、ディレクトリ入れ間違ってたら意味ないですけどね!


おわりに

書いといてなんなんですが、最初からインポート時も移動時も

OnPostprocessAllAssetsで処理すればいい気がしてきました(:3っ)∋〜