kidoOooOoooOOom

IT系で開発やってます

UnityでFBXファイルをインポートした時のデフォルト設定を自動化

Maya等で作成した3Dモデルが含まれるFBXファイルはUnity上にドラッグ&ドロップするだけでインポートが可能だが、デフォルト設定では色々とまずいので設定を変える必要があったりする。
インポートするファイルの数がたいしたことなければ問題ないが、100を超えるような物量に毎回同じ設定変更を行うのは効率が悪いので、スクリプトで自動化する。

Unityでは、AssetPostprocessorというクラスを継承すれば、インポート時のパイプラインにフックして特定の処理を行うことができる。
docs.unity3d.com


例えば、UnityとMayaでスケールの設定が異なっているため Modelのscale sizeを1から100に変更したいような場合は OnPreprocessModel() で値を変更すればおk。

void OnPreprocessModel ()
{
	var modelImporter = assetImporter as ModelImporter;
	modelImporter.globalScale = 100;
}

Importで生成された Materials に対して、特定のshader 割り当ておよび、パラメータ設定を行いたい場合は、OnPostprocessModel で生成されたMaterial に対して変更すればおk。

void OnPostprocessModel (GameObject gameObject)
{
	foreach (Transform item in gameObject.transform) {
		if (item.gameObject.GetComponent<Renderer> () == null) {
			continue;
		}

		foreach (Material material in item.GetComponent<Renderer>().sharedMaterials) {
			// shader を変更
			material.shader = Shader.Find ("HogeHogeShader");

			// shader のパラメータを変更
			material.SetFloat ("_HogeHogeParam", 0.1f);
			material.SetTexture ("_SampleCube", Resources.Load ("sample_texture") as Texture);
		}
	}
}

Unity上ですでにimport済みのファイルをReimportした場合もこの処理は走るので、せっかく設定したカスタム値を上書きしないように制御する必要があるので注意。