【ue4】【蓝图】流程篇

前言

常见的流程控制结构

Sequence

Branch

ForLoop

ForLoopWithBreak

ForEachLoop

WhileLoop

Do Once

Do N

FipFlop

Gate

MultiGate

Sequence 序列

使单个执行脉冲能按顺序触发一系列事件

节点可有任意数量的输出

所有输出引脚都会在序列节点获得输入时马上被调用

无延迟地按顺序调用

Branch 分支

类似于 if-else 分支结构

上图类似于下面的 C++ 代码

1
2
3
bool flag = true;
if(flag) { cout << "HelloWorld" << endl; }
else { cout << "ByeBye" << endl; }

ForLoop 循环

类似于 for循环结构

上图类似于下面的 C++ 代码

1
2
3
4
for(int i = 0; i <= 10; ++i) {
cout << i << endl;
}
cout << "EndLoop" << endl;

forloop 的蓝图宏过程如下

可以看出局部变量 Variable 的作用就相当于上面 C++ 代码中的 i

ForLoopWithBreak 循环

可以使用自定义事件来结束循环

在循环体内需要 break 的地方调用此自定义事件即可

上图类似于下面的 C++ 代码

1
2
3
4
5
for(int i = 0;  i <= 100; ++i) {
if(i < 10) cout << i << endl;
else break;
}
cout << "EndLoop" << endl;

ForEachLoop 循环

常用于对 array 操作

在实际中常结合 GetAllActorsOfClass 对一种类型的全部集合进行操作

WhileLoop 循环

相当于 c++ 中的 while循环

上图类似于下面的 C++ 代码

1
2
3
4
5
6
int idx = 0;
while(idx < 10) {
cout << idx << endl;
++idx;
}
cout << "EndLoop" << endl;

WhileLoop 的宏如下

通过一个分支(用来判断是否结束) 和 一个序列(用来循环执行)来实现

我们可以基于这个自己实现一个带有 delay 功能的 while 宏

在循环体里加了一个 delay 函数的调用即可

Do N

只会执行 N 次, 直到执行 Reset 重置

Do Once

相当于上面的 Do N 中的 N = 1 的情况

只会执行 1 次, 直到执行 Reset 重置

FipFlop

切换执行

先执行A, 再执行 B , 依次交替执行

同时有一个 bool 变量,如果当前执行的是 A, 此 bool 变量为 true

Gate 门

用来开启和关闭执行流

门的状态决定是否从 Exit 传出

MultiGate

取入单个数据脉冲并将其传送到任意数量的潜在输出

随机按顺序发生

可能会造成循环

总结

通过了解上述的流程控制

我们几乎可以将蓝图类比到其他的语言

只要有了流程控制,一些复杂的功能也可以实现

但是蓝图难以协作和调试的特点使我们很难用它来开发复杂的东西

但是既然学到了这里,我们不妨来试一下

这里我们拿 快速幂 来练手

pow_mod(a, b, m) 函数用来快速计算 在模m下a的b次方

c++代码如下

1
2
3
4
5
6
7
8
9
10
int pow_mod(int a, int b, int mod) {
int r = 1; a %= mod;
while(b) {
if(b&1) r = (r*a) % mod;
a = (a*a) % mod;
b >>= 1;
}
return r;

}

转换成蓝图

这也许是不提倡用蓝图写逻辑的原因,更不用说写算法了(.)/