Epic Gamesが配布している、Unreal Engineの様々な機能のサンプルをまとめたプロジェクト「機能別サンプル(Content Examples)」の中に、UE4.26では、Niagara AdvancedというMapがあります。
そこでは、Niagaraの新機能やそれを使った応用例など、とても参考になるサンプルが多く配置されていて、実装内容を見てみるとたくさんの学びがあります。
それらのサンプルについて、いくつかの記事に分けて解説を行っていきます。
ちなみに、機能別サンプルはEpic Games Launcherのラーニングタブからダウンロードできます。また、UEのバージョン毎に内容が違うので注意してください。
TLDR;)
- NiagaraからBlueprintにデータを送信できるようになったよ
- 送信できるデータは、現状2つのVectorと1つのFloatまでだよ
- CPU SimでもGPU Simでも使えるけど、GPUの方は設定をちゃんとしないと遅延が大きくなるよ
はじめに
この記事では、Niagara Advancedの「4.2 Export Particle Data to Blueprints」の解説をします。
名前の通り、Niagaraから2つのVectorと、一つのFloatを、Niagara Particle Callback HandlerというInterfaceを継承したBlueprintに通知することができます。
この機能は、CPU SimとGPU Simどちらでも使えますが、GPUの方だと1,2フレームの遅延が起こりえるのと、少し設定すべき項目が増えます。
今回の内容は、小難しいことはないので、単純に設定方法の説明になります。
4.2 Export Particle Data to Blueprints の解説
左上にログが出ているのがわかります。Particleが床と衝突する度にBlueprintにカラーとポジションの情報が送られ、その値をプリントしています。
先にNiagaraの方の実装から見ていきましょう。
まず、Objectというデータ型のUser Parameterを用意します。ここに、通知先のBlueprintを後で設定します。
CPU SimとGPU Simの二つのEmitterがありますが、どちらもほぼ同じで、設定内容が少し異なるだけです。
Blueprintにデータを送る実装は、Export Particle Data to Blueprintsというモジュールで行っています。
Condition To Export Data がtrueになるとデータが送られます。ここでは、CollisionValidをバインドすることで、衝突した時にデータを送るようにしています。
Vector to Send (As Struct Position)、Vector to Send (As Struct Velocity)、Float To Send (As Struct Size)という項目で、Blueprintに送る二つのVectorと一つのFloatを設定できます。ここでは、PositionとColorをバインドしています。
Callback Handler Parameterのところに、先ほど作成したObject型のUser Parameterをバインドします。ここで設定したBlueprintにデータが通知されます。
こちらは、GPU Simの方の設定ですが、Export GPUの項目に注意が必要です。GPU Simの場合は、GPUからCPUへのデータのやり取りなので、やり取りするデータサイズが大きくなるほど遅延につながります。なので、サイズを大きくしないように、GPUAllocation ModeをFixed Sizeに指定し、GPUAllocation Fixed Sizeを必要最小限の大きさにすることが推奨されています。
この場合、一回の送信で4つまでのデータしか送られなくなります。4を超えると(同一フレームで5個目以降の衝突したParticle)単純に無視されます。
これで、Niagaraの方の設定は終わりです。
次にBlueprintの方の設定を見ていきます。
サンプルのExportParticleDataExampleというBlueprintを開くと、コメントで設定手順が書いてあります。これに従ってやっていけば問題ないですが、一応手順の説明をしておきます。
まず、上のToolbarにあるClass Settingsというボタンをクリックします。すると、右のDetailsパネルに設定欄が出てくるので、その中からInterfacesという段のAddボタンを押し、Niagara Particle Callback HandlerというInterfaceを追加します。
すると、左下にReceive Particle Dataというものが出現するので、その上で右クリックして、Implement eventを選択します。
そうすると、Event Receive Particle Dataというノードが追加されます。Niagaraからデータの送信があると、このノードが呼ばれます。
一度に複数のParticleのデータが送られるので、For Each Loopで一つずつ処理してあげて、Break BasicParticleDataノードで、送られてきた情報を便宜的に、Position, Velocity, Sizeという名前でパースし、後は良しなに使ってあげればOKです。
あとは、最初にNiagara側のUser Parameterに自分自身を設定してあげるのを忘れてはいけません。
これで、Niagaraからデータの通知を受け取ることができるようになりました。
おわりに
NiagaraからBlueprintに任意のタイミングで値を送信できるのは地味に便利な機能だなと思いました。
Niagara間、Particle間、Niagara-GBuffer、Niagara-Blueprintなど、データのやり取りができるようにどんどんなってきていて、Artistだけでも、より複雑なものを構築できるようになる下地が出来上がってきているのではないかと思います。
よりInteractiveなエフェクトが作れると面白くなっていきそうですね!