UE/Niagara の DynamicParameter のデフォルト値は、UEのバージョンによって異なる

# 要約
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|


:::note warn
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がある場所のコードを見る|
|---|---|
|![無題の画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/ae7b03fd-562a-6898-4216-6b7c41550161.png)|![無題の画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/6ad305e1-92bc-b491-750f-98ab3680b591.png)|

:::



**以下、上記のことを延々と解説しているだけ**

Unreal Engine の Niagara で Dynamic Material Parameter モジュール を使う時、Index や parameter の一部を有効にしたり、無効にしたりする。
この無効にした時に、UE のバージョンによって自動的に入る値が変わる(0 と 1 の入り方が変わる)
つまり、UE のバージョンごとの Niagara の Dynamic Material Parameters モジュールの内容によって、パラメーターを無効にした時に入るデフォルト値が変わる。
そのため、原因とUE のバージョンに依らないための手段を下記の**回避手段**と**原因**の項目で紹介する。
また、**挙動**の項目に検証したバージョンと値の入り方のパターンを列挙しているが、他にもあるかもしれないので**検証方法**の項目を参考に、使っているバージョンの検証をお勧めする。

|パラメーターが無効になっているときの、デフォルト値が異なる |
|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/4039b95c-c7a3-7854-1520-beeeaaedf7fc.png)|








# 回避手段1
使用する UE のバージョンが変わった時に思いがけない値が入るのを防ぐために、Dynamic Material Parameter モジュールの 使う Index のパラメーターをすべて有効にし、変更しない値もデフォルト値を入れておく。
力業だが、結局これが一番。
ただ、UE5 は使うパラメーターが含まれる index だけ良いが、UE4 は Index1 が無効の時のデフォルト値が Index0 を参照してしまっている。
そのため、UE4 は必ず Index1 を有効にするか、material の Dynamic Parameter ノードで設定した Index0 と Index1 のデフォルト値を同じにしておく必要がある。

|使う Index の パラメーターはすべて有効にし、値を入れる|
|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/0359de26-dbef-21ef-41cf-b145fd505749.png)|








# 回避手段2
そもそも、index を 有効にし、個々のパラメーターを無効にした時に、material の Dynamic Parameter ノードで設定したデフォルト値が入らないことが直感に反している。
そのため、Dynamic Material Parameters モジュールを改造する。
下記の手順をする理由は、**原因**の項目を参照。

Dynamic Material Parameters モジュールをダブルクリックしてモジュール内に入り、左上の Browse から content Browser 内の Dynamic Material Parameters モジュールを探す。
そしてこれを複製して、適当に名前を付け、これを改造する。

|ここら辺にあるので、これを複製する|
|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/2e7f4a9b-981c-5040-3137-09558d084b8e.png)|

複製して名前を付けたモジュールの中に入り、左下の parameters の Module Inputs の項目の右の＋を押して、 Vector 4 を作る。これを4回繰り返し、それぞれに Index0Default、Index1Default、Index2Default、Index3Default と名前を付ける。

|Module Inputs で Vector 4 で検索して Vector 4 型の変数を作り、名前を変更|
|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/df2c5605-0db3-3c66-3308-50bc156aca63.png)|

そのあと、中央の 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 を一つずつ入れる|
|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/afd55dcc-82b3-7eac-9e6d-6fc23874080d.png)|


この改造したモジュールを 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が有効になっていないと表示されない)|
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/b890e379-ff1b-0e38-fb0b-5f19a5464e6f.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/c1767e67-95f4-1bb0-680e-db8f83b85827.png)|


または、Material を1種類しか使わない場合は、System Attribute を使うと、個々のモジュールにデフォルト値をセットする手間が省ける

|System Attributes で Vector 4 型の変数を作る|Map Get ノードに 自作した MTest_Default0~3 を一つずつ入れる|
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/618f2fd4-420b-306f-4859-fc125e2e6225.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/12a7fcce-ca69-a276-2815-bafb01563b7b.png)|
|**Niagaraで モジュールで設定した同じ型/名前の System Attribute を設定する**||
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/7f58bd1f-2376-8508-4502-54afcdb881e9.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/1d6cce2c-4eee-4423-7aa6-6d66b142c531.png)|


なお、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が出ない|
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/50de07e5-e03e-fb0d-ace2-c7995c081303.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/1bfb5727-1626-ee48-cf5f-cb856ca18c75.png)|



このことから、 Niagara 内で、DynamicMaterialParameter が設定されなかったときは、Material の Dynamic Parameter ノードで設定したデフォルト値が参照され、一方、一つでもパラメーターを使うため、Index を有効にすると、Vector 4 型の PARTICLES DynamicMaterialParameter ができることが分かる。
この時、Index内の個々の Param が無効になっているときは、Material のデフォルト値ではなく、Dynamic Material Parameters モジュールのデフォルト値が参照される。

|Index を有効にし、Param が無効だと、モジュール内のデフォルト値が参照される|
|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/558d2931-4fc6-5382-f20a-f1ee99b54ca8.png)|

また、なぜか Index 1 の時だけデフォルト値が 1,1,1,1 で他は0,0,0,0。

|Index 1 の時だけデフォルト値が 1,1,1,1 |
|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/169076bf-941d-dd51-c828-9007908f7139.png)|

まとめると、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 になってしまっている|
|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/ab376373-8ccb-7b91-6b70-a8a3182b82f8.png)|







# 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 ノード  |
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/e0e40141-c632-5050-da80-5c68dfc7d029.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/555a88d0-73df-214e-5501-a2fba06782a7.png)|
|Param1 は 0、Param2,3,4 は 1 が入る|モジュール の Index が有効の時、Default Value は無視される|


|例2_Index 0 が有効の時|  |
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/3b549ab6-8692-540f-ff3b-10b84852db51.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/cb563f97-1154-93c3-a814-e4c07eeab759.png)|
|Param2 は 5、Param1,3,4 は 0 が入る|モジュール の Index が有効の時、Default Value は無視される|


|例3_Index が無効の時|  |
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/fef5ba7e-9e04-ce7b-d5b6-8fbed54e716c.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/c671456a-e8d5-aef8-35ac-ee243ba8eaa0.png)|
|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 ノード  |
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/fedeea50-567c-61ee-d467-47dcadf2f61f.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/90f83996-a840-3b06-3f7f-2b420b1ab2b1.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/7b32204d-01ae-f9ab-b14f-b113c7d6d3c3.png)|
|Param1 は 3、Param2 は 5、Param3 は 0、Param4 は 1 が入る|Index1 ではなく、Index0 が参照される|

|例2_Index 1 が有効の時 |  |
|---|---|
|Niagara の Dynamic Material Parameter モジュール|Material の Dynamic Parameter ノード  |
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/3d03d154-ccaf-ef7f-9183-c7e18e5e38ae.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/7b32204d-01ae-f9ab-b14f-b113c7d6d3c3.png)|
|Param1 は 0、Param2 は 2、Param3 は 5、Param4 は 0 が入る|Index1 ではなく、Index0 が参照される|





# 検証方法
下記の画像のような material を作り、Niagara system の emitter に割り当てる。
Dynamic Material Parameter モジュールの値を切り替えてみて、Niagara の エフェクトが白か黒になるかを見ながら、どの数値が参照されているかを考察した。

|すべてのパラメーターを add して、Emissive Color に繋げる |
|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362049/3524edc3-b451-69cc-5e6a-8478fec40441.png)|