UE5 ナイアガラパラメータコレクションに関するメモ

# 概要
UnrealEngine5 の Niagara のパラメータ関連のメモ書きです。


## 更新履歴
| 日付 | 内容 |
|:-----|:----|
|2024/09/27| 初版 |


## 参考
以下の記事を参考にいたしました、ありがとうございます。
[UE公式：UNiagaraComponent](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Plugins/Niagara/UNiagaraComponent?application_version=5.2)
[UE公式：UNiagaraParameterCollection](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/API/Plugins/Niagara/UNiagaraParameterCollection%3Fapplication_version%3D5.2?application_version=5.2)
[[UE5.3.2][Niagara]Niagara Parameter Collection の使い方](https://furcraea.verse.jp/wp/2024/02/13/ue5-3-2-niagara-how-to-use-niagara-parameter-collection/)
[UE5 Niagara C++ドキュメント（非公式）](https://hamaruki.com/ue5-niagara-c-documentation-unofficial/)





# ナイアガラコンポーネント(UNiagaraComponent)
ナイアガラを扱うためのコンポーネントです。スカラーパラメータ等を入れる際に使ったりします。

```C++:.cpp
	// ナイアガラエフェクト生成
	UNiagaraComponent* _NC = UNiagaraFunctionLibrary::SpawnSystemAttached(...省略...);

	// パラメータを入れる 
	_NC->SetVariableFloat(TEXT("Scale"), 0.5f);
 	_NC->SetVariableVec3(TEXT("Position"), FVector(0.0f, 0.0f, 100.0f));
```


# ナイアガラパラメータコレクション(UNiagaraParameterCollection)
ナイアガラエフェクトシステムで使用される共通のパラメータセットで、複数のエミッタなどでパラメータを共有しまとめて更新することができます。

[FX]->[高度]->[Niagaraパラメータコレクション]でアセットを作成します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/04f5207b-aacb-7ee9-3503-1decaa05d088.png">

パラメータは[+]から追加することができます。
![NiagaraParameterCollection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/b0860bb5-790c-0245-d744-058cbf2738bf.png)



## 使い方
### エミッタのパラメータを差し替える

ナイアガラシステムの[パラメータ]ウィンドウの[Niagaraパラメータコレクション]の[+]から作成したナイアガラパラメータコレクションアセットを登録します。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/3baa025f-e44b-febc-cec7-be757c723710.png">

NPCに登録されているパラメータ一覧が表示されるのでそれをエミッター詳細ウィンドウの適用したい変数へドラッグ＆ドロップすると適用されます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/5ad701c1-62e5-15a6-0e7a-5012d561455b.png">

:::note warn
型が違う場合は警告が出ます。
:::


### パラメータを取得する
C++ にてナイアガラパラメータコレクションからパラメータを取得できます。
```C++.h
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Niagara")
TObjectPtr<UNiagaraParameterCollection> NPC;
```

```C++:.cpp
	// ナイアガラパラメータコレクションインスタンスを取得する
	UNiagaraParameterCollectionInstance* _NPCI = NPC->GetDefaultInstance();
	if(_NPCI){
		// NPCIからパラメータ取り出し
		const float _Scale = _NPCI->GetFloatParameter(FString(TEXT("Scale")));
		const FVector _Position = _NPCI->GetVectorParameter(FString(TEXT("Position")));
	}
```

### パラメータ名を取り出す
ナイアガラパラメータコレクションに設定されたパラメータ名を取り出すこともできます。以下コード例。
```C++:.cpp
auto _NPCI = NPC->GetDefaultInstance();
// ネームスペース 
const FString _Namespace = _NPCI->GetParent()->GetFullNamespace();

// パラメータ名を取り出す
TArray<FNiagaraVariable> _OutParams;
_NPCI->GetParameters(_OutParams);
for (const auto& _Prm : _OutParams) {
	FString _Full = *_Prm.GetName().ToString();
	FString _Short = _Full.Replace(*_Namespace, TEXT(""), ESearchCase::IgnoreCase);
	UE_LOG(LogTemp, Log, TEXT("Full:%s / Short:%s"), *_Full, *_Short);
}

```

これを利用してデータアセット的な使い方も可能です。


# ナイアガラパラメータインスタンス(UNiagaraParameterCollectionInstance)
ナイアガラパラメータコレクション(NPC)から作成できるインスタンスでパラメータのオーバーライドができます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/64a15b1a-825b-aa84-fefc-6afd89aa35d9.png">

基本はNPCからの値を使用するが、一部だけ差し替えたい場合などに使えます。


# まとめ
複数のナイアガラシステムからのパラメータ共有に便利だと思います。実行中にNPCを変更した場合はどうなるのかよくわかりません。