BLOGブログ

2016.08.20UE4UE/ Material

[UE4]マテリアルの順番を固定する方法

テクニカルアーティストの黒澤です。
UE4では一つのアクターで複数のマテリアルを使用した場合Elementという形で複数のマテリアルが使われるのですが、そのマテリアルの順番を固定する方法を紹介します。

そもそもなぜ固定したいのか?

そもそもなぜマテリアルの順番を固定したいのでしょうか?主な理由は2つあります。

  • アクターに使用しているマテリアルを名前などで直接参照する方法がない
  • アクターを編集した場合、マテリアルの順番が変わることがある

最初の項目について簡単に解説します。アクターからマテリアルを取得したり設定したりするには、ElementIndexでしか指定できません。

Blog_GetMat

二番目の項目についてはいわずもがなです。モデルを修正するたびにElementIndexが変わってしまうと、せっかく書いたBlueprintを修正しなくてはいけません。

すべてのキャラクターでマテリアルの順番を固定することが可能になれば、キャラクターの髪のマテリアルを交換できる機能を、キャラクターのElement##番のマテリアルを差し換えるという仕組みでで作ることができます。

マテリアルの順番を固定する方法

マテリアルの順番がなぜ変わるのか、マテリアルの順番を固定する方法については、FBXマテリアルパイプラインに記載されています。
FBX マテリアル パイプライン

メッシュに適用されるマテリアルの順序が重要な場合、マテリアルのための特別な命名規則を使用することによって、特定の順序を指定することができま す。デフォルトでは、マテリアルがアンリアル エディタ内でランダムに作成されます。したがって、マテリアルの順序を保証することができません。これは、たとえば、胴体のマテリアルが第 1 のマテリアルであり、頭部のマテリアルが第 2 のマテリアルであるというように、キャラクターのシステムがマテリアルの順序に依存しているキャラクターを扱う場合に問題となります。

_人人人人人人人_
> ランダム! <
 ̄Y^Y^Y^Y^Y^Y ̄

デフォルトではランダムに作成されるというなかなか思い切った仕様です。アクターを編集した際にマテリアルの順番が変わるのはこの仕様上、しょうがないことですね…
ドキュメントによれば、skin## という命名規則を使用することによって、マテリアルの順序を指定します。早速やってみましょう!

icecream

Mayaでこのようなオブジェクトを作成します。
マテリアル名は以下のようにつけています。

  • tray
  • grape_skin01
  • raspberry_skin02
  • orange_skin03
  • lemon_skin04
  • pistachio_skin05

Ue4_icecream

UE4にインポートしてみました。たしかに順番はあっています。しかし名前がなにかおかしい…
勘の良い人はここで気がついたかもしれませんが、Skin##をつけたマテリアルはマテリアル名が強制的に6文字になっています。

6文字を超えたらどうなるの?

マテリアル名が6文字を超えた場合はどうなるのでしょう?先ほどのマテリアルに以下のマテリアルを加えました。

  • chocolate_bitter_skin00
  • chocolate_sweet_skin06
  • chocolate_white_skin07

Ue4_icecream2

chocolate~のマテリアルはそれぞれchocol、chocol2、chocol3と別のマテリアルになるのですが、Elemetが小さいほど濃い色のチョコレートにしているのが正しく反映されていません。
よって、マテリアル名が6文字を超えて6文字までの名前が重複した場合、Skin##をつけてもそれらのマテリアルの順番の固定は上手く動かない、と言えると思います。(trayにはもともとSkin##をつけていないのでどこに入るかランダムです)

結論:マテリアル名に_skin##をつけるとマテリアルの順番を固定できます。
(ただし、マテリアル名が6文字に固定されるので、6文字以内でユニークな名前にする必要があります)

ゲームのマテリアル名が6文字で収まることはまずないので、この方法は非常に使いにくいですが、マテリアルの順番を固定したい場合の一つの方法として、6文字に収まる名前を検討したほうが良いかもしれませんね。

追記

マテリアルの名前を直接取得したり設定したりすることはできないのですが、マテリアルの名前をElementIndexごとに照らし合わせることで、どのElementIndexにマテリアルが割り当てられているか得ることができます。
キャラクターの髪の毛のマテリアルを交換する場合は、このような方法でキャラクターごとに髪の毛の
ElementIndexを探しだすという方法もあるかと思います。

Ue4_icecream3