Niagara内からマテリアルのパラメーターを上書きできたんだが

## はじめに

結論から言います。
マテリアルで用意したパラメーターはNiagara内から上書きができました。

これによって以下のことが可能になります。

・DynamicParameterの上限を超えた数のパラメーター制御
・BPを介さずNiagaraからマテリアルに数値を送る
・マテリアルインスタンスの数を圧倒的に削減できる
（・なんならマテリアルインスタンスが要らない）
・DynamicParameterが使えないDecalRendererの制御

～～～～～～～～～

私が確認していないこと
・上書きする場合とマテリアルインスタンスを用意した場合の処理負荷等の差
・大量のマテリアルインスタンスの管理コストと上書きで作成した場合の管理コストの差

～～～～～～～～～

以下から作業手順です

## 使用するマテリアルの用意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/8f5a013b-000d-c74d-01f1-1829115418d7.png)


シンプルなデカールのマテリアルを用意しました。
デカールをNiagaraで使用する場合、ParticleColorノードやDynamicParameterは使用でないため恩恵が大きいです。

今回は面倒だったのでOpacityには円を繋いでいます。

## Niagara側の準備

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/2640a1bc-c0cf-1fdc-4633-745a62cffd2d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/635eec6e-73c4-3fe1-9208-1ea7e355c1ce.png)

NSをCompletelyEmptyで作成後、Emitter State、Spawn Burst、Initialize Particle、Decal Rendererを追加し、先ほど作成したマテリアルをインスタンスを作らずそのまま入れました。


## Niagaraでの操作の前に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/20ed5850-ccbb-7b45-662d-06aebba4a1d4.png)

Decal RendererのBindingsを開いてください。
ここにあるものは、今出ているデカールを構成する属性の一覧です。

あまりここをいじる人がいないと思うので軽い説明を入れておくと、
上から4番目にあるDecalSizeの数値を弄ることで大きさを変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/38343e80-19cf-9b6f-66d4-f3e78297732c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/31d39363-00df-8246-c21e-91ace9eb9509.png)

数値設定ようにSet Parametersを用意しDecal Sizeを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/257f02b6-1ef1-bb61-5e9c-84b95bcb898b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/5ebc3a3e-32e7-5859-4c74-c5e1d437fd8d.png)

数値の変更で大きさが変わることを確認できました。

## Niagaraでの操作

では今確認したBindingsの中の一番下に
「Material Parameters」という項目があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/c6c803b4-ba26-3f38-3f92-2df1728d53f9.png)

ざっくりとしか確認していませんが、
Attribute Bindingsはすべてのパラメーターに対応していて、Niagara側で用意した変数を入れることができます。
その下のScalar・Vector・Texture・Static Boolは名前に対応したパラメーターしか入れることしかできず、変数を入れることはできません。
管理のしやすさを考えると、変数の入らないパラメーターは対応している場所にいれるのがよさそうです。

ではパラメーターを上書きしていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/93ab5c6a-ce89-a39d-a219-2095011cf419.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/6b6263e4-e730-667a-3c26-37115b46c4e3.png)

Niagaraの中からマテリアルのパラメーターである
Metallic・Specular・Roughness・Normalの強さ・色・テクスチャを差し替えることができました！

～～～～～～～～

次にAttribute Bindingsを用いて変数を入れてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/6ab01190-b85f-687b-c9a9-d5b6729c34a3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553932/5e343c3e-23a1-3e77-b867-11d42bc2dc32.png)

マスクのサイズをSineカーブで拡縮するようにしてみました。
https://x.com/Niagara_UE4/status/1819176410155831504

今回は拡縮しか行っていないのでDecal Sizeでもいいのですが、マテリアルをしっかりと作れば

・UVを歪ませる強度を変える
・デカールの色の変化
・テクスチャの差し替え

など行えます。

さらに、用意した変数が入れられるということは、実質的にNiagaraにあるパラメーターをマテリアルに送れるということ！！！

例えば、
・速度によってUVを歪ませる
・大きさによってデカールの色を変える
・位置によってテクスチャを差し替える
など、細かい操作ができるようになります！！！

夢が広がりますね！！


## 注意点

Attribute Bindingsで上書きできるパラメーターはパーティクル毎ではなくEmitter単位・System単位です。
System.〇〇かEmitter.〇〇の変数しか使用できません。

・速度によってUVを歪ませる
・大きさによってデカールの色を変える
・位置によってテクスチャを差し替える

がしたい場合はエミッターごとに分ける必要があります。


## 最後に

なんかもっといい感じのNiagaraの機能を見つけたら教えてください。
調べてほしい機能とかあれば見てみますので、教えてください。

よきNiagaraライフを。