PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 ParticleDataを使用したNiagaraとBlueprintの連携

環境

UE4.24.3 (解説は基本的にすべて4.25です)
UE4.25.2

NiagaraEmitterの情報にBluerprintからアクセスする方法

UE4.25 以前のアクセス方法
UE4.24.3等ではGet Niagara Emitter XXでEmitterの情報にアクセスが可能でした
こちらはEmitter名を指定するだけなので非常にお手軽でした
f:id:PaperSloth:20200801100245p:plain


しかし、UE4.25からはこれらのノードが廃止されています
f:id:PaperSloth:20200801100437p:plain

そこで、UE4.25以降ではNiagara Emitterの情報をどのようにしてBluerprintから取得するのかという点について解説していきます

Niagara側の設定

data export用のModule作成

まずはFX -> Niagara Module Scriptから新規にModuleを作成します
f:id:PaperSloth:20200801100658p:plain

名前はひとまず「NMS_ExportExample」としました
f:id:PaperSloth:20200801100841p:plain

Niagara Module Scriptを作成したら先ずは忘れないように
「Expose to Library」にチェックを入れます
ここにチェックをしないと、Niagara Emitterから使用することができません
f:id:PaperSloth:20200801101004p:plain

続いて、dataをexportするための「New Export particle data」を追加します
f:id:PaperSloth:20200801101141p:plain
f:id:PaperSloth:20200801101149p:plain

次に「Store Particle Data」を使用してDataを格納します
f:id:PaperSloth:20200801101435p:plain

  • Store Data : データを保持する条件です。

チェックを入れた場合は常時値を保持するようになります
条件式を加える例として、PaticleにCollision Moduleを追加してHitした時のみ位置情報を格納するなどの使い方が考えられます

Position, Size, Velocityは特別解説するようなこともないので、素直に値を入れてあげればよいです
今回の例では位置情報のみを使用するため、以下のように設定しました
f:id:PaperSloth:20200801101737p:plain

しかし、これだけではMap Setしていないためエラーになってしまうので値を追加してあげます
Particle Attributesに新規にbool型の変数を追加し「StoreSuccess」と名付けました
名前はなんでもいいです
f:id:PaperSloth:20200801102019p:plain

追加したAttributeをMapSetに追加して、StoreParticleDataの返り値を設定します
f:id:PaperSloth:20200801102135p:plain
f:id:PaperSloth:20200801102230p:plain

これでModule Scriptは完成です。
f:id:PaperSloth:20200801103107p:plain

Niagara Systemの作成

新規にNiagara Systemを作成し、New system from selected emitter(s) を選択します
f:id:PaperSloth:20200801105318p:plain

Emitterは「Omnidirectional Burst」を選択します
Emitter to Addから追加し、作成完了です
f:id:PaperSloth:20200801105437p:plain

名前は「NS_Example」としました
f:id:PaperSloth:20200801105619p:plain

NS_Exampleを開いて「Particle Update」に先程作成した
「NMS Export Example」を追加します
f:id:PaperSloth:20200801105723p:plain

このままではCallback Handler Parameterに設定可能なParameterがないため、新規にParameterを追加する必要があります
f:id:PaperSloth:20200801105836p:plain

Parametersの「User Exposed」に「Object」型のParameterを追加します
f:id:PaperSloth:20200801105856p:plain

ひとまず「ExportHandler」と名付けました
名前はなんでもいいですが、後ほどBlueprintと連携する際にこの名前が必要になります
f:id:PaperSloth:20200801110005p:plain

Object型のParameterを追加したことでNMS Export Exampleに設定可能なHandlerができました
「NMS Export Example」を選択し、Callback Handler Parameterに「User.ExportHandler」を設定します
f:id:PaperSloth:20200801110204p:plain

これでNiagara Emitter側の設定は完了です

おまけとしてCollisionを追加しておきました
後のデバッグでの挙動確認用です
f:id:PaperSloth:20200801111953p:plain

Blueprint側の設定

長かったですが、ここまできてようやくBlueprintからのEmitterの値の取得が可能になります。
「Actor」を継承したBlueprintを作成し、「BP_ExampleActor」と名付けました
f:id:PaperSloth:20200801110437p:plain
忘れないうちにLevel上の適当な位置に配置します

「BP_ExampleActor」を開くと、まずはComponentの追加で
Niagara Particle System」を追加します
f:id:PaperSloth:20200801110558p:plain

追加したComponentを選択し、先程作成した「NS_Example」を割り当てます
f:id:PaperSloth:20200801110636p:plain

続いてNiagara Systemの「ExportHandler」の初期化を行います
NiagaraのComponentから「Set Niagara Variable(Object)」を選択し
「BeginPlay」から呼び出し、図のように繋ぎます
f:id:PaperSloth:20200801110937p:plain
これで「NS_Example」の「ExportHandler」に対して「BP_ExampleActor」を割り当てることができました

次にNiagaraのCallback関数の呼び出しを行います。
「Class Setteings」を選択して
f:id:PaperSloth:20200801111059p:plain

Interfaceの追加から「Niagara Particle Callback Handler」を選択します
f:id:PaperSloth:20200801111215p:plain

MyBlueprintタブのInterfacesに「Receive Particle Data」が追加されていれば設定ができています
f:id:PaperSloth:20200801111318p:plain

続いて「Receive Particle Data」から「Implement Function」を選択して
Receive Particle Dataに処理を追加します
f:id:PaperSloth:20200801111416p:plain
f:id:PaperSloth:20200801111437p:plain

Niagara EmitterのPosition情報を取得してDebug用のSphereを描画してみました
f:id:PaperSloth:20200804174154p:plain
これで値が正しく取得できていることが確認できました
f:id:PaperSloth:20200801112144g:plain

まとめ

今回の作例ではNiagara Module ScriptからPositionにのみ値を設定したため
Position以外には値が割り当てられていません
逆にModule Script内で処理を書くことで様々なカスタムした値の割り当てが可能です

また、ModuleのStore Dataフラグの工夫次第でヒット判定など様々な条件の判定が可能です

ここまで読んでいただいた方はよく分かったと思うのですが
UE4.24に比べてUE4.25でのNiagara Emitterの情報を取得するのが大変手間です
他にもっとスマートな方法を知っている方はTwitter等で教えてもらえると嬉しいです。以上です。

以上です