今回はUnityにアセットをインポートした時に処理を実行したいと思います。
インポートしたアセットの設定等をインポートした後に手動で変更するのではなく、スクリプトであらかじめ設定を変更しておく事が出来ます。
インポート時に処理をするスクリプトの作成
アセットのインポート前後に何らかの処理をさせるにはAssetPostprocessorクラスを継承して新しいクラスを作成します。
1 2 3 4 5 6 7 8 | using UnityEngine; using System.Collections; using UnityEditor; public class AssetPostProcessorTest : AssetPostprocessor { } |
AssetPostprocessorクラスにはアセットインポート時に実行されるメソッドがあるのでそれを使用します。
作成したクラスはEditorフォルダの下に移動させます。
アセットの種類で実行されるメソッドが変わる
AssetPostprocessorクラスで定義されているメソッドはインポートするアセットの種類によって実行されるものが変わります。
アセットの種類はモデル、アニメーション、テクスチャ、スプライト、音声等で変化します。
それぞれインポート前(Pre)とインポート直後(Post)のメソッドが用意されていますが、アニメーションは前(Pre)のみになるようです。
サンプルを作成し試してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | using UnityEngine; using System.Collections; using UnityEditor; public class AssetPostProcessorTest : AssetPostprocessor { // モデルのインポートが完了した時に呼ばれる void OnPostprocessModel(GameObject obj) { ModelImporter importer = (ModelImporter) assetImporter; // グローバルスケールを変更 importer.globalScale = 100; Debug.Log ("OnPostprocessModel:" + obj.name); } // テクスチャのインポート時に呼ばれる void OnPostprocessTexture(Texture2D texture) { Debug.Log ("OnPostprocessTexture"); } void OnPreprocessAnimation() { Debug.Log ("OnPreprocessAnimation"); } } |
メソッドはOnの後にPreかPostで前後が変わり最後にインポートの種類で分かれています。
今回のサンプルではモデルのインポート後(OnPostprocessModel)、テクスチャのインポート後(OnPostprocessTexutre)、アニメーションのインポート前(OnPreprocessAnimation)を使いました。
OnPreprocessAnimationはモデルのインポート前に実行されるようでUnityのスクリプトリファレンスでもOnPreprocessModelと同じ説明がされています。
実際にモデルだけ、アニメーションだけのfbxファイルを取りこんでみましたがどちらのメソッドも呼ばれました。
OnPreprocessAnimationとOnPreprocessModelの違いはあるんでしょうか?今のところよくわかりません。
OnPostprocessModelではAssetPostProcessorで定義されているassetImporterをキャストしModelImporter型に変換します。
ModelImporterはモデルのインスペクタで表示されるインポート設定と対応しているので、globalScaleに100を入れる事でモデルをインポート時にScale Factorを100にします。
またOnPostprocessModelではGameObject型の引数を受け取る事が出来るのでそれを使ってオブジェクトの名前を表示しています。
OnPostprocessTextureはUnityにテクスチャをインポートした時に呼ばれます。
今回はコンソールにメソッドが呼ばれた事を表示しているだけで何もしていません。
サンプルが出来たのでモデルやテクスチャをUnityにインポートして試してみましょう。
インポートはUnityにファイルをドラッグ&ドロップして確認してみます(Assetsフォルダで右クリックからインポートでもOK)。
↑のようにモデル、テクスチャの種類によってコンソールに表示される文字列が変わっているのが確認出来ました。
アセット操作時に何らかの処理をしたい
先ほどはアセットのインポート前後で何らかの処理をしたい時に専用のメソッドを呼び出していましたが、
アセットのインポート時だけでなくアセットの削除、アセットの移動時に処理をしたい事もあると思います。
そんな時はクラスメソッドのOnPostprocessAllAssetsを使います。
このクラスメソッドは第1引数でインポートするアセットのファイルパス配列、第2引数で削除するアセットのファイルパス配列、第3引数でアセットの移動先のファイルパス配列、第4引数でアセットの移動元のファイルパス配列を受け取ります。
ファイルパスはAssetsからの相対パスになります。
アセットの操作は複数選択して行う事もあるので配列としてファイルパスを受け取ることになります。
AssetPostprocessorTestクラスにOnPostprocessAllAssetsを追加してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // アセットのインポート、削除、移動時に呼ばれる static void OnPostprocessAllAssets (string[] import, string[] delete, string[] move, string[] moveFrom) { Debug.Log ("OnPostprocessAllAssets"); // アセットインポート if (import.Length != 0) { foreach (var path in import) { Debug.Log ("import:" + path); } } // アセット削除 if (delete.Length != 0) { foreach (var path in delete) { Debug.Log ("delete:" + path); } } if (move.Length != 0) { // アセットの移動先 foreach (var path in move) { Debug.Log ("move:" + path); } } // アセットの移動元 if (moveFrom.Length != 0) { foreach (var path in moveFrom) { Debug.Log ("moveFrom:" + path); } } } |
受け取ったファイルパスが存在していればある分だけファイルパスを表示するようにしています。
サンプルが出来たので確認してみましょう。
↑のようになりました。
インポート後、フォルダ移動、削除時にそれぞれコンソールにファイルパスが表示されているのが確認出来ます。
終わりに
アセットインポート前後でアセットの設定を操作したい事もあると思います。
そんな時に今回のようなスクリプトを知っておくと便利ですね。
あまり実用的なサンプルを作成出来なかったので便利かどうかはわかり辛いですけど・・・・・(^_^;)