要約
NiagaraのDynamicParameter のデフォルト値
以下、DMP = Dynamic Material Parameters (Niagara Module Script)
UE5.3(DMP ver1.2) | Parameter Index が無効 | Parameter Index が有効 |
---|---|---|
Index0,1,2,3 | Material で設定したデフォルト値 | Material で設定したデフォルト値 |
UE5(DMP Ver1.1) | Parameter Index が無効 | Parameter Index が有効 |
---|---|---|
Index0,2,3 | Material で設定したデフォルト値 | 0,0,0,0 |
Index1 | Material で設定したデフォルト値 | 1,1,1,1 |
UE4 | Parameter Index が無効 | Parameter Index が有効 |
---|---|---|
Index0,2,3 | Material で設定したデフォルト値 | 0,0,0,0 |
Index1 | Material で設定した Parameter Index0 のデフォルト値 | 0,0,0,0 |
24/1/16追記
UE5.3、DMP ver1.2では、Dynamic Material Parameters に値を指定しなければMaterialで設定したデフォルト値が常に選択される、感覚通りの実装となってました。
DMP ver1.2では Particle Attribute:ChannelMask が追加され、これが各IndexのParameterのOn/Off情報をNiagaraの処理部分に持ってい行っているようです。
この処理部分は Niagara System を開いて、Window → Generated Code から DMPのある場所のコードから見れます(VisualStudio 等にコピペし、dynamicParameter 等でコード内検索すると実装部分が見やすい)
Niagara System を開いたウィンドウ | DMPがある場所のコードを見る |
---|---|
以下、上記のことを延々と解説しているだけ
Unreal Engine の Niagara で Dynamic Material Parameter モジュール を使う時、Index や parameter の一部を有効にしたり、無効にしたりする。
この無効にした時に、UE のバージョンによって自動的に入る値が変わる(0 と 1 の入り方が変わる)
つまり、UE のバージョンごとの Niagara の Dynamic Material Parameters モジュールの内容によって、パラメーターを無効にした時に入るデフォルト値が変わる。
そのため、原因とUE のバージョンに依らないための手段を下記の回避手段と原因の項目で紹介する。
また、挙動の項目に検証したバージョンと値の入り方のパターンを列挙しているが、他にもあるかもしれないので検証方法の項目を参考に、使っているバージョンの検証をお勧めする。
パラメーターが無効になっているときの、デフォルト値が異なる |
---|
回避手段1
使用する UE のバージョンが変わった時に思いがけない値が入るのを防ぐために、Dynamic Material Parameter モジュールの 使う Index のパラメーターをすべて有効にし、変更しない値もデフォルト値を入れておく。
力業だが、結局これが一番。
ただ、UE5 は使うパラメーターが含まれる index だけ良いが、UE4 は Index1 が無効の時のデフォルト値が Index0 を参照してしまっている。
そのため、UE4 は必ず Index1 を有効にするか、material の Dynamic Parameter ノードで設定した Index0 と Index1 のデフォルト値を同じにしておく必要がある。
使う Index の パラメーターはすべて有効にし、値を入れる |
---|
回避手段2
そもそも、index を 有効にし、個々のパラメーターを無効にした時に、material の Dynamic Parameter ノードで設定したデフォルト値が入らないことが直感に反している。
そのため、Dynamic Material Parameters モジュールを改造する。
下記の手順をする理由は、原因の項目を参照。
Dynamic Material Parameters モジュールをダブルクリックしてモジュール内に入り、左上の Browse から content Browser 内の Dynamic Material Parameters モジュールを探す。
そしてこれを複製して、適当に名前を付け、これを改造する。
ここら辺にあるので、これを複製する |
---|
複製して名前を付けたモジュールの中に入り、左下の parameters の Module Inputs の項目の右の+を押して、 Vector 4 を作る。これを4回繰り返し、それぞれに Index0Default、Index1Default、Index2Default、Index3Default と名前を付ける。
Module Inputs で Vector 4 で検索して Vector 4 型の変数を作り、名前を変更 |
---|
そのあと、中央の Node Graph の4つある Map Get ノードの PARTICLES DynamicMaterialParameter ピンを右クリックして、 Remove Pin をする。
そして、同じ Map Get ノードの一番下の+から、Index 0 Default と検索して、自作した Index 0 Default ピンを追加する。
このピンと、もともと PARTICLES DynamicMaterialParameter ピンとつながっていたノード Break Vector 4 のぴんをつなげる。
これを左から、0,1,2,3 となるように4回繰り返す。
4つある Map Get ノードに 自作した Index0~3Default を一つずつ入れる |
---|
この改造したモジュールを Niagara で追加して、モジュールの Selection タブの一番上に表示されている(Index が有効になっていないと表示されない) Index 0~4 Default に、material の Dynamic Parameter ノードで設定したデフォルト値と同じ数値を入れる。
改造した Dynamic Material Parameter モジュール を何度も使う予定があるなら、User Parameters で Index 0~4 Default と命名した Vector 4 のパラメーターを作り、ここにデフォルト値を入れて、個々の改造したモジュールにこのパラメータを入れて使うようにすると、ミスが減るし、material 変更時も調節しやすい。
User Parameters で Vector 4 型を4つ作る | User Parameter をモジュールの変数に適用(Indexが有効になっていないと表示されない) |
---|---|
または、Material を1種類しか使わない場合は、System Attribute を使うと、個々のモジュールにデフォルト値をセットする手間が省ける
System Attributes で Vector 4 型の変数を作る | Map Get ノードに 自作した MTest_Default0~3 を一つずつ入れる |
---|---|
Niagaraで モジュールで設定した同じ型/名前の System Attribute を設定する | |
なお、index が無効の時は、material の Dynamic Parameter ノードで設定したデフォルト値が、index が有効の時は、モジュールの Index 0~4 Default が参照されるので、その二つの値が常に同じになるように注意。
この方法は、モジュールを改造(自作)しなければいけないのと、デフォルト値を自分で入れなければならないので、回避手段1 と比べて使える場面は限られるが、値を変更したいものだけを有効、その他は確実にデフォルト値を参照するので、モジュールの値管理はしやすくなる。
原因
Unreal Engine 5.0.3 と Unreal Engine 5.2.1
Niagara 内で、Dynamic Material Parameters モジュールの Index を有効/無効を切り替えたときに、 Parameters を見ると、Index を有効にすると PARTICLES DynamicMaterialParameter が出るが、無効にすると出ない。
Index を有効にすると DynamicMaterialParameterが出る | Index を無効にすると DynamicMaterialParameterが出ない |
---|---|
このことから、 Niagara 内で、DynamicMaterialParameter が設定されなかったときは、Material の Dynamic Parameter ノードで設定したデフォルト値が参照され、一方、一つでもパラメーターを使うため、Index を有効にすると、Vector 4 型の PARTICLES DynamicMaterialParameter ができることが分かる。
この時、Index内の個々の Param が無効になっているときは、Material のデフォルト値ではなく、Dynamic Material Parameters モジュールのデフォルト値が参照される。
Index を有効にし、Param が無効だと、モジュール内のデフォルト値が参照される |
---|
また、なぜか Index 1 の時だけデフォルト値が 1,1,1,1 で他は0,0,0,0。
Index 1 の時だけデフォルト値が 1,1,1,1 |
---|
まとめると、Niagara から Material に Dynamic Parameter を送る時には、float ではなく vector 4 の型で送っている。そのため、index が無効の時のデフォルト値と、Index を有効でParam が無効の時のデフォルト値の参照先が違う。
だが、直感的には、Index を有効でParam が無効の時も Material のデフォルト値を参照してくれるような気がする。
実際に調べると、UE の質問ページにこのことの報告があり、長年直っていないバグと指摘されているが、これは仕様と直感の乖離がユーザーの認識を勘違いさせているからだと考えられる。
Unreal Engine 4.24.3 と Unreal Engine 4.27.2
UE4 では上記に付け加えて、Dynamic Material Parameter モジュールの Index1 が無効の時のデフォルト値が Index0 を参照してしまっている。
一方、Index1 が有効の時のデフォルト値は 0,0,0,0 になる
これは、Dynamic Material Parameter モジュール内の、Index1 に相当する Map Get ノードのピンが DynamicMaterialParameter1 ではなく、DynamicMaterialParameter になっているのが原因。
UE5では改修されている。
Map Get ノードのピンが、DynamicMaterialParameter1 ではなく、DynamicMaterialParameter になってしまっている |
---|
UE5の挙動
Unreal Engine 5.0.3 と Unreal Engine 5.2.1
Dynamic Material Parameter モジュールの Write Parameter Index が無効になっている時のみ、Material で設定した Default Value が参照される。
Index を有効化し、パラメーターは無効にする時、自動的に Index 1 (2個目) は 1 が、その他(Index0、2、3)は 0 が入る。
例1_Index 1 が有効の時 | |
---|---|
Niagara の Dynamic Material Parameter モジュール | Material の Dynamic Parameter ノード |
Param1 は 0、Param2,3,4 は 1 が入る | モジュール の Index が有効の時、Default Value は無視される |
例2_Index 0 が有効の時 | |
---|---|
Param2 は 5、Param1,3,4 は 0 が入る | モジュール の Index が有効の時、Default Value は無視される |
例3_Index が無効の時 | |
---|---|
Param1 は 5、Param2 は 0、Param3 は 8、Param4 は 1 が入る | モジュール の Index が無効の時、Default Value が参照される |
UE4の挙動
Unreal Engine 4.24.3 と Unreal Engine 4.27.2
基本的には挙動1と同じ。
ただ、Dynamic Material Parameter モジュールの Index1 が無効の時のデフォルト値が Index0 を参照してしまっている。
例1_Index 1 が無効の時 | |
---|---|
Niagara の Dynamic Material Parameter モジュール | Material の Dynamic Parameter ノード |
Param1 は 3、Param2 は 5、Param3 は 0、Param4 は 1 が入る | Index1 ではなく、Index0 が参照される |
例2_Index 1 が有効の時 | |
---|---|
Niagara の Dynamic Material Parameter モジュール | Material の Dynamic Parameter ノード |
Param1 は 0、Param2 は 2、Param3 は 5、Param4 は 0 が入る | Index1 ではなく、Index0 が参照される |
検証方法
下記の画像のような material を作り、Niagara system の emitter に割り当てる。
Dynamic Material Parameter モジュールの値を切り替えてみて、Niagara の エフェクトが白か黒になるかを見ながら、どの数値が参照されているかを考察した。
すべてのパラメーターを add して、Emissive Color に繋げる |
---|