如何从 Blueprint 获取 Niagara Emitter 的粒子位置信息

3,060 阅读4分钟

“我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛

如何从 Blueprint 获取 Niagara Emitter 的信息

UE 4.25 之前

UE4.25 版本之前比如 UE4.24.3, 存在通过 Get Niagara Emitter XX 访问发射器(Emitter)信息的方法 这非常简单,因为只需要指定发射器的名称。

image.png

但是这些节点从 UE4.25 就被废弃了。。。

f:id:PaperSloth:20200801100437p:plain

所以,接下来我将介绍,在 UE4.25 和以后,如何从蓝图中获取 Niagara 发射器的信息。

UE 4.25 之后

Niagara 端的设置

用于数据导出的模块(Module)创建

首先, 我们从 FX-> Niagara Module Script 创建一个新的模块

image.png

并将它的名字取为 "NMS_ExportExample"

f:id:PaperSloth:20200801100841p:plain

创建 Niagara Module Script 之后, 首先勾选 "Expose to Library" ,以免忘记。如果你不在这里检查,你将无法从 Niagara 中使用它。

f:id:PaperSloth:20200801101004p:plain

接下来,我们添加 "New Export particle data" 来输出粒子数据

image.png

f:id:PaperSloth:20200801101149p:plain

然后使用 "Store Particle Data" 来存储输出的粒子数据

image.png

  • 存储数据(Store Data): 保留数据的条件。

如果你勾选了它,该值将始终被持有。

作为 添加条件表达式 的示例,你可以将碰撞模块Collision Module)添加到 Particle ,并仅在点击时存储位置信息。

关于位置、大小和速度没有什么特殊含义,所以可以如往常一般输入这些值。

在这个例子中,只使用了 位置 信息,所以我设置如下

image.png

然而,仅仅完成以上这些将导致一个错误,因为 Map Set 没有完成,所以我将添加一个值 —— 我添加一个新的 bool 类型变量到粒子属性(Particle Attributes),命名为 “StoreSuccess”,但你可以取任何名字。

f:id:PaperSloth:20200801102019p:plain

添加新增的属性(StoreSucess)到 MapSet,并设置为 StoreParticleData 的返回值

f:id:PaperSloth:20200801102135p:plain
f:id:PaperSloth:20200801102230p:plain

这样就完成了模块脚本(Module Script)。

image.png

创建 Niagara System

创建一个新的 Niagara 系统,并选择 New system from selected emitter (s)

image.png

接着为发射器选择 "Omnidirectional Burst" (全向爆发)

image.png

然后命名为 "NS_Example"

image.png

打开 NS_Example,将之前创建的 “NMS Export Example” (NMS_Export Example 模块脚本) 添加到 “Particle Update” 中

image.png

事实上,在 Callback Handler Parameter 中没有参数(即实现粒子数据回调的蓝图对象)可以设置,所以 有必要 添加一个新的参数。

f:id:PaperSloth:20200801105836p:plain

User Exposed 参数栏中 添加一个类型为 Object 的参数

f:id:PaperSloth:20200801105856p:plain

我暂时将其命名为 “ExportHandler” ,名称是什么并不重要,但是稍后会在使用 Blueprint 时,将需要这个名称

f:id:PaperSloth:20200801110005p:plain

通过添加对象(Object)类型参数, Handler 可以在 NMS Export Example (在 Blueprint 中)被创建之时进行设置(将用于对接的蓝图对象设置进去)。选择 NMS Export Example,在其下的 Callback Handler Parameter 中设置 User.ExportHandler

f:id:PaperSloth:20200801110204p:plain

这就完成了 Niagara Emitter 端的设置。

除此以外,我还添加了 碰撞 ,为了之后便于调试时检查其行为  

image.png

Blueprint 端的设置

前面啰嗦了那么多,现在终于有可能从蓝图得到发射器的值了。  

创建一个继承自 Actor 的 Blueprint,并将其命名为 “BP_ExampleActor”。 不要忘记把它放在关卡中一个适当的位置。

f:id:PaperSloth:20200801110437p:plain

当你打开 “BP_ExampleActor” 时,首先通过添加组件添加 “Niagara Particle System” 。

f:id:PaperSloth:20200801110558p:plain

选择添加的组件,并分配之前创建的 “NS_Example

f:id:PaperSloth:20200801110636p:plain

接下来,初始化 Niagara 系统的 ExportHandler。 在 Niagara 组件中选择 Set Niagara Variable (Object) 结点,在 BeginPlay 结点后调用并连接它,如图所示。 

另外,还将为它的 Object 分配 “BP_ExampleActor” (即之前 Niagara 中设置的回调对象)

image.png

接着,需要实现 Niagara 的回调函数(即通过对接对象获取粒子数据的方法),选择 “Class Settings

image.png

Add 界面里选择 "Niagara Particle Callback Handler

image.png

如果 “Receive Particle Data” 被添加到 “我的蓝图” 标签页上的界面,那么它就被设置了。

f:id:PaperSloth:20200801111318p:plain

然后在 “Receive Particle Data” 中选择 “Implement Function” (实现了该接口的回调函数),之后便可以添加对 Receive Particle Data 的 (事件) 具体处理。

f:id:PaperSloth:20200801111416p:plain

image.png

至此,我们就 得到了 Niagara 发射器的 位置 信息,并试图绘制用于调试的球体。 

现在我可以确定正确地获取了该值。

image.png

20200801112144.gif

总结

在这个例子中,因为这个值只在 Niagara 模块脚本(Module Script)中为 Position 设置,所以除了 Position 之外的值不会被赋值。  

但是,可以通过在模块脚本中进一步编写来分配各种自定义值。  

此外,还可以根据模块的 Store Data 标志的设备判断各种条件,如命中判断。