SOU·COLLE
イラストレーション/デザイン/3DCG/ゲーム開発のお話

Unityのマテリアルリストの順序をBlenderで制御する

マテリアルが複数指定されたオブジェクトをUnityに読み込むと,マテリアルをアサインしたリストを自動的に生成してくれる。

で,Blenderで作成したのならリストの順序はマテリアルインデックスの順序…と勝手に思い込んでいた。リストの順序はメッシュの順序から決められている。

リストの順序が変わるとどう困るか

先日,オブジェクトを差し替えた時にマテリアルの並びがシャッフルされ,意図しない順序にアサインされたため小一時間ほど理由がわからず困っていた。
編集するたびにリストの順序を変えられてしまっては,インポートのたびにマテリアルをアサインし直さなければならない。リストの順序に実装が関わっていればなお面倒。

意図しない順序に並べられたマテリアルの図
メッシュ編集前の図。マテリアル名の番号がマテリアルインデックスの順で,並びはバラバラだが意図通りの表示になっている。インポート設定のマテリアルインポートは切ってある
マテリアルの順序がシャッフルされてしまった図
メッシュ編集後の図。マテリアルの並びは変わっていないが,各Elementが対応しているメッシュが変更されてしまったため色がズレてしまった。

Blenderでの対策

普段,メッシュの順序を気にしながら編集することはないと思う(オブジェクトの結合ではベースになるオブジェクトのメッシュが前列に来るぐらいはわかるが)。

マテリアルインデックスの順で管理するには,編集モードで「要素をソート」を使用する。順番が不確定なら書き出すたびにソートしてやる必要があるが,それさえ守ればマテリアルインデックスの順できっちり管理することができる。

メッシュを全選択して「wキー」でスペシャルを開く,「メッシュ要素をソート」を選択して最後に「マテリアル」を選択
メニューからは3Dビューで対象のメッシュを選択して「メッシュ>要素をソート…>マテリアル」でOK。一見して何も変化しないので少し不安になる。
fbx形式で書き出してUnityにインポートした。マテリアル名に割り振ったマテリアルインデックスの順の通りに並んだ。

メッシュの順序を実装に使用する場合,マテリアルの順序は好きに管理できないという疑問点は残るが,とりあえず今はそういうケースは無いのでこれで良しとする。