【UE4】 在 Blueprint 中常用的流控制节点

1,021 阅读4分钟

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

总览

Blueprint 在默认提供了方便的流控制节点有,如 Flip FlopGateDoNMultiGate。 在 C++ 中即使做类似的处理有时也很麻烦,如果能很好地使用这些节点,就可以很简洁地编写处理程序。  

下面将介绍以下节点。

image.png

Flip Flop

image.png

每次执行时,进程 AB 交替执行。  

在一个简单的例子中,可能更容易理解门的开/关过程和按钮操作。  

在本例中构造的节点中,每次按下 Enter 键时都会输出 “Open” 和 “Close” 日志。

image.png

当第一次按下 Enter 键时,输出 “Open”,当  

然后再按下 Enter 键,输出“Close”。  

如果你再次按下 Enter 键,“Open” 将会输出。  

这样,连接到 Flip Flop 节点的 A 的输出和 B 的输出,将会被交替执行处理。

例如,可以设置录音开始按钮和录音结束按钮,以便调试。

image.png

如果你尝试在不使用 Flip Flop 的情况下配置相同的处理,配置将如下所示( IsCapture 的默认值为 false)  

与使用 Flip Flop 不同的是,您需要添加一个 bool 变量。  

而且可以减少可以精简的变量,这样就不会使 Blueprint 复杂化。

image.png

Gate

image.png

如果进入 Enter : Gate 状态为 Open 的话,则执行该进程。  

  • Open: 将 Gate 设置为 Open 状态(当进程进入 Enter 时,进程将被执行)
  • Close: 将 Gate 设置为 Close 状态(进程将处于 Enter 状态时,在 Close 状态时,进程将不会执行)
  • Toggle: Open <-> Close 状态的切换  
  • Start Closed: 是否将默认的 Gate 状态更改为 Close 状态的标志

如上所述,该行为与进程何时进入 Enter 一样简单,如果连接到 Exit 的进程处于 Open 状态,则执行该进程,如果处于 Close 状态,则不执行该进程。  

顾名思义,门(入口,门),当门打开时进行处理,当门关闭时不进行处理。

示例

在这个使用示例中,我们实现了一个只有当按下右键时才会旋转的摄像机。

20210113214123.png

无论鼠标是否在移动,MouseX 节点返回鼠标在前一帧的横向移动量。  

它是一个输入节点,像 Tick 一样处理每一帧。  

我把它与一个 Gate 结合,这样当你按下右键它打开,当你释放时它关闭。  

这将只有当你按住右键点击时,才会调用 AddControllerYawInput 。   Gate 经常与 TimelineTick 结合在一起。  

你可以很容易地实现一个它只在一定的体积(Volume)内运行的函数,或者是一个只在执行特定的输入时运行的函数。

Do N

image.png

  • Enter: 如果保留 N 中设置的次数,则执行 Exit 所连接的进程。
  • N: 可执行的最大数量  
  • reset: 以 N 指定的值来重置 Counter
  • Exit: 连接你想要执行的进程  
  • Counter: 已经执行的次数(注意:它不是剩余的可以执行的次数,即它是 1,2,3 的方式增加的) 。此外,当你 Reset 时,Counter 也会被重置。

当你希望创建一个可以执行一定次数的函数时,你可能想使用该节点。  

这也是人们很容易误解 DoN 的地方,尽管你能认为它的确将运行你所指定的 N 次

当您希望创建一个进程其仅能执行有限的次数的时候,才适合使用该节点。

  • 例1、只能获得一定次数的事件(一个方块的图像,可以获得某个运行游戏的硬币)  
  • 例2、销毁处理一个对象,该对象可以通过应用一定数量的攻击而被销毁

20210113214123.png

MultiGate

image.png

  • Input: 默认情况下,输入按顺序工作,当所有输出完成时,函数就不会运行了。
  • Reset: 初始化为 StartIndex 指定的值。  
  • Is Random: 随机执行输出。 如果没有设置 Loop 标志,则所有操作都将停止工作。  
  • Loop: 可以在所有执行完成后再次执行。  
  • Start Index: 该索引显示函数的第一个输出。 在 -1 的情况下,如果没有设置 Loop ,它将从顶部顺序执行。

例子: 如果你想依次切换三个摄像头  

首先,在 Level 上放置三个摄像头,如下图所示。

image.png

通过使用 MultiGate 并勾选 Loop,你可以这样切换摄像头 1-> 2-> 3-> 1… ,如下图所示。

image.png

20200801112144.gif

即使不使用 Loop 标志,也可以在执行完最后一个进程后通过连接到 Reset 来创建一个 Loop,如下所示,行为和之前一样。

image.png

如果你选择 Random,行为将如下所示。  

但是,在某些情况下,输出与执行 Random 的结果 Out0-> Out0 相同,因此使用时请记住这一点。

20200801112144.gif

总结

除了上面描述的那些节点之外,Blueprint 中还有许多有用的节点。  

在这个例子中,GateMultiGate 等在 C++ 中构建时会有点麻烦。   至于 Flip Flop,C++ 就相对很简单。  

Blueprint 的另一个优点是,可以轻松地增加或减少输出的数量,如MultiGate。  

将现有节点存放在脑海的角落里,以便未来创建更可读的节点流(node flow)。