モデルやテクスチャ、オーディオデータをインポートするとき、かならず決まった処理をすることはありませんか。
たとえば・・・。
Model項目だったら、Scale Factorを10にしておきたいとか、Materialsの設定を読み込み時点で切り替えておきたいとか
Animation項目で言うと、key reduction(キー削減)をいちいちoffにしたりとか。(これは良くあります)
こういったような、何かインポートするときに何かを処理をする関数がAssetPostProcessorクラスに用意されてます。
今回は、モデル(FBX)、テクスチャ、オーディオのインポート直前に呼び出される関数について説明します。
ソースコード
サンプルソースコードは以下
using System.Collections;
using System.Collections.Generic;
using UnityEditor; //これ書き忘れないように。
public class ImportProcess : AssetPostprocessor
{
//モデル(FBXなど)をインポートする直前の処理
void OnPostprocessModel()
{
// assetImporterにインポートするオブジェクトが入る。それをモデル型にキャスト
ModelImporter MdlImporter = assetImporter as ModelImporter;
//アニメーションのリサンプルをoff
MdlImporter.resampleCurves = false;
//etc...
}
//テクスチャをインポートする直前の処理
void OnPreprocessTexture()
{
// assetImporterにインポートするオブジェクトが入る。それをテクスチャ型にキャスト
TextureImporter TexImporter = assetImporter as TextureImporter;
//テクスチャのanisoLevelを1に設定
TexImporter.anisoLevel = 1;
//etc...
}
//オーディオファイルをインポートする直前の処理
void OnPreprocessAudio()
{
//....
}
}
使い方
このソースコードをImportProcess.csという名前で作ってUnityプロジェクトの
Assets>Editorフォルダ以下に配置してください。
※Editorフォルダというのはその名の通り、ゲームには実装されないけれど、UnityEditor内で動く(作り手側の使う)スクリプトなどが含まれるフォルダになります。ちなみにUnityEditorをカスタマイズしていくことをエディター拡張というようです。
簡単な解説
いつもコードトップでusingしているUnityEngineではなく、UnityEditorを呼びだしているところに気をつけてください。これは、Editor関連の処理を書きたいときには必ず必要になってきます。
using UnityEditor; //これ書き忘れないように。
class はMonoBehaviorではなくAssetPostProcessorを継承しているのでここも注意です。これは、アセット読み込み関連のクラスであることを表します。
public class ImportProcess : AssetPostprocessor
あとはほぼコメントの通りですので、お好きなように読み込み設定を変更する処理を走らせてください。基本的にUnityのGUIで触れるインポート設定は網羅しているはずです。
ちなみに・・・
PreがあるということはPostもあるのでは・・・?と思って調べてみると
こちらは完全にインポートが完了して、ゲームオブジェクトと化す直前に呼び出されるようで、初期位置を変更したりができるようです。(それ以外にいい活用方法が思いつきません・・・)
おまけ
今回はAssetPostProcesser クラスの中で実行したことによりassetImporter変数には、自動的に今読み込んだアセットが入っていました。
そうではなく、後から任意のアセットに対して処理をしたいという場合があります。
その方法は以下です。
string path = "" //FBXアセットへのパス
ModelImporter MdlImport = AssetImporter.GetAtPath(path) as ModelImporter;
17/02/09追記:
このあとから処理する方法ですと
手作業でやるときと同じように設定が完了したあとに"Apply"をしなければいけないようです。
もろもろの設定が終わった後以下を呼び出してください。
MdlImport.SaveandReimport();