#memo

indiedev太郎

Substance Graph InstanceをBP内で生成する

UE4のダイナミックマテリアルインスタンスの挙動で、同じクラスのインスタンスだけれども、それぞれのseed値は違うみたいなことをsubstanceでしたい、が、やっとできたのでメモ

Allegorithmicのフォーラムみても、同様の質問あっても回答がいまいちよくわからなかったのだけれど、このスレッドはなんかそれっぽい感じだった

Blueprint instance question

流れとしては、BPインスタンス毎に、Substance Instance FactoryからSubstance Graph Instanceを作成して、生成されたテクスチャをUEのDymamic Material Instanceにパラメーターとして渡す感じ

ここからは手順

1. factoryの設定を変更する
これが一番わかりにくくて最後までハマっていたところなんだけれど、この設定がデフォルトのままだとBP側からInstanceが生成されない

https://i.gyazo.com/c090975281255f1c529e2fe59d95ef0c.png

Factoryを右クリックして Asset Actions > Bulk Edit via Property Matrix...を選択

https://i.gyazo.com/4ee30539e356fff5233f67d905d8e1c6.png

右上にこんなのがあるんで、SGM on Load Asyncに変更、これがなんなのかはよくわからないですね・・・

2. Dynamic Material Instance用のマテリアルを作成

https://i.gyazo.com/eed3756c37c60cc64ca8777b9842dc0a.png

差し替えるのでテクスチャは適当に、詳細は省略

3. BPでInstanceを作成

https://i.gyazo.com/b6f1299e3c72ffd68a182fad1536fbad.png

この3つのノードはセットで運用する
はじめにCreate Graph InstanceノードでFactoryを指定してInstanceを作成
Graph Desc IndexはソースファイルのGraphのIndexの指定、Graphが一つしかないソースなら0

次はCreate Instance Outputs、これでテクスチャを書き出す、Output indicesは書き出すOutputのIndexを配列で突っ込む、書き出すOutputのIndexというのはソースでgraphを選択すると一番下に表示されてて並び替えることが出来る。このソースはbaseColor一つのoutputしか存在していないため、画像のような配列を指定

最後はAsync Rendering、これでゲーム中にSubstanceを更新する

これでSubstance Graph Instanceの生成が完了、後は生成されたテクスチャをDynamic Material Instanceに渡す

https://i.gyazo.com/e08dbf1633be4628e1d8e591181680db.png

Get Substance TexturesでOutputsの配列にアクセスできる、今回はbaseColor一つのためget 0

後は通常通りDynamicMaterialInstanceを生成し、Parameterとして生成された画像を渡す

 

https://i.gyazo.com/38260ae6783afe5f12891604885f5d62.png同一BPで違うシードを持ったインスタンスができた

ただ微妙に不安定で、コンストラクションスクリプトより、イベントグラフに上のノードがあったほうが良かったり(レベルに配置してると落ちる)、よくわからないことが微妙にあるけどもう知りません