Skip to main content

Dynamic Impulses (动态脉冲)

Dynamic Impulses (动态脉冲)

Dynamic Impulses(动态脉冲)允许 Impulses(脉冲)传播到世界中任意位置的其他 ProtoFlux 程序中,这使得可以用简单的模块构建大型、复杂的程序。

20260205202247_1.jpg

动态脉冲还有按钮组件变体,这些组件也有用于发送数据的替代版本。这些组件可以像 Dynamic Impulse Trigger(动态脉冲触发器)ProtoFlux 节点一样触发 ProtoFlux。

用法 (Usage)

动态脉冲主要由两部分组成:Trigger(触发器)和 Receiver(接收器)。

Receiver(接收器) 接收一个字符串 Tag(标签),对于带有数据的变体,它还会输出一个数值。标签和类型决定了它监听的内容。只有当脉冲的标签和数据类型都正确匹配时,动态脉冲才会被触发。如果没有指定类型,接收器也必须设置为无类型。只有满足这些条件,脉冲才会从该节点流出。

20260205202348_1.jpg

Trigger(触发器) 需要指定一个目标 Slot(插槽)、一个 Tag(标签),以及可选的数值。目标 Slot 下方每一个具有匹配标签和数值类型的接收器都会被触发。如果触发器没有数据类型,接收器也必须没有数据类型。

20260205202325_1.jpg

警告:

由于触发器在每次脉冲时都会扫描整个层级结构以寻找所有符合条件的接收器:因此强烈不建议频繁地通过脉冲激活触发器(这会造成性能开销)。

提示:

接收脉冲的 Slot(即链接到 TargetHierarchy 的 Slot)必须是 TargetHierarchy 的子节点才能接收到脉冲。通常可以通过至少打包(Packing)一次 ProtoFlux 来实现层级关系的建立。

此外,动态脉冲还可以携带单个值或引用。能够实现此功能的 ProtoFlux 节点包括 Dynamic Impulse Trigger With DataDynamic Impulse Receiver With Data。也有对应的组件变体,如 Button Dynamic Impulse Trigger With ReferenceButton Dynamic Impulse Trigger With Value。数值由触发器发送,并由接收器接收。

细节 (Specifics)

Dynamic Impulse TriggerDynamic Impulse Receiver 用于不包含数值的动态脉冲。

动态脉冲触发器会将它接收到的脉冲发送给所有匹配的接收器。

重要提示: 这意味着在触发脉冲的上下文中的任何可用信息(例如发生碰撞的碰撞体),对于接收器来说也是可用的。这也使得动态脉冲是即时的(Instant)。如果有多个接收器,它们会按顺序运行;它们永远不会同时运行。动态脉冲的无限循环最终会导致相关节点中断(崩溃保护)。

异步 (ASync)

还存在 ASync(异步)变体的触发器和接收器。

ASync Dynamic Impulse Trigger 收到脉冲时,它会等待(Await)它找到的每一个 ASync Dynamic Impulse Receiver。接收器被触发的顺序是深度优先搜索(Depth first search)。只有当此搜索完成且每个异步接收器都已完成执行(也称为 Awaiting/等待完成)后,Next 输出端才会被触发。

提示:

异步接收器只响应异步触发器,非异步接收器只响应非异步触发器。两者之间不存在“串扰”(Cross-talk)。

示例 (Examples)

标签 (Tags)

此示例演示了标签如何决定触发哪些接收器,以及接收器是如何一个接一个被触发的:

(图示说明:标签为 "Tag A" 的触发器触及了所有标签匹配为 "Tag A" 的接收器。下一个匹配的接收器仅在当前接收器完成执行后才会被触发。执行顺序当前基于层级结构。)

类型 (Types)

此示例展示了标签如何基于类型进行重载(Overloaded):

(图示说明:只有类型与触发节点/组件匹配的接收器才会被触发。即使是子类型也不能触发其父类型接收器。例如:String 类型的触发器无法触发 Object 类型的接收器。)

目标层级 (Target Hierarchy)

此示例演示了目标层级是如何被遍历的:

(图示说明:第一个脉冲触发器触及了目标 "Parent" 内的两个接收器,而第二个触发器仅触及了目标 "Child B" 内的接收器。)

数值 (Values)

关于数值如何传输的示例:

(图示说明:"Changing Value" 初始为 2,被计算一次后用作动态脉冲的载荷(Payload)。该数值仅在接收器的 OnTriggered 脉冲执行期间可用。注意:触发器输入的更改不会实时反映,必须在触发瞬间捕获。)

同步与异步 (Sync vs. ASync)

一个简单的示例,展示异步触发器/接收器与普通变体是相互独立的。

(图示说明:异步触发器触及异步接收器,同步触发器触及同步接收器。)