6 - 数据结构与控制流

光速过一遍蓝图编程,本文将光速过一遍蓝图中的高级数据结构和控制流,包括:

  • 容器:数组,集合,映射;
  • 其他数据结构:枚举,结构体,数据表格;
  • 控制流节点,如SwitchSequence等;

容器

容器是一种数据结构,其实例可以存储值或实例的集合,容器中的值必须具有相同的类型。

数组

数组是一种容器类型,用于存储特定数据类型的一个或多个值。它提供对元素的索引访问。

如果要在蓝图中动态创建一个数组,需要使用Make Array节点:

要获取/修改数组的值,需要分别使用Get (a copy)节点与Set Array Elem节点:

要给数组添加新元素,可以使用ADD节点或INSERT节点。前者直接将元素添加到数组末尾,而后者可以指定插入的位置,并移动其余的元素。

要想获取数组的长度,可以使用LENGTH节点。要想获取数组最后一个元素的索引(即LENGTH - 1),可以使用LAST INDEX节点。

此外,还有获取随机元素的Random Array Item节点,判断数组是否为空的Is Empty节点等。

集合

集合是一个无序的唯一元素的列表,按元素值本身进行查找。

常用到的节点如下:

  • ADD:向集合中添加一个元素;

  • ADD ITEMS:向集合中添加一个数组的元素;

  • REMOVE:删除集合中的一个元素,成功返回True;

  • REMOVE ITEMS:删除集合中由数组指定的元素;

  • CLEAR:删除集合中的所有元素;

  • CONTAINS:集合中是否包含给定元素;

  • LENGTH:返回集合中元素个数;

  • TO ARRAY:将集合元素复制到一个数组中;

  • UNION:集合间的并集运算;

  • DIFFERENCE:集合间的差集运算;

  • INTERSECTION:集合间的交集运算;

  • Make Set:用给定元素在蓝图中动态创建一个集合;

映射

映射容器使用键值对定义每个元素,不允许出现重复的键,可以出现重复的值。

常用到的节点如下:

  • ADD:向映射中添加一个键值对,如果该键已存在,旧值会被覆盖;

  • REMOVE:向映射中移除一个键值对,成功删除返回True;

  • CLEAR:删除映射中的所有元素;

  • LENGTH:返回映射中的元素数量;

  • CONTAINS:该映射的键中是否包含给定元素;

  • FIND:返回映射中给定键对应的值;

  • KEYS:将映射的所有键复制到一个数组中;

  • VALUES:将映射的所有值赋值到一个数组中;

其他数据结构

枚举

枚举是一种数据类型,包含一组固定的命名常量。要创建一个枚举类型,需要在“内容浏览器”,“蓝图”,“枚举”中创建。

要想在蓝图中使用枚举类,需要为它创建一个变量,然后就能使用了。

结构体

结构体是一种复合数据类型,是不同类型变量的组合。要创建一个结构体类型,需要在“内容浏览器”,“蓝图”,“结构体”中创建。

常用到的节点有MakeBreak节点,它们可以组成或分解一个结构体变量:

数据表格

数据表格(Data Table)是基于特定结构的值表,用于表示一个电子表格文档。这对于数据驱动的游戏玩法很重要。要想创建一个数据表格,可以在“内容浏览器”,“其他”,“数据表格”中创建。

表中不同列的原型是一个结构体:

此外也能用CSV文件进行导入/导出操作:

要想在蓝图中使用数据表格,首先创建一个它的变量,然后使用如下节点:

  • Get Data Table Row:返回一个指定行的数据的结构体;
  • Get Data Table Row Names:将数据表的所有行名复制到一个数组中;
  • Get Data Table Column as String:将列的所有值复制到字符串数组中;

流控制节点

Switch节点

进行高级分支操作:

Flip Flop节点

先执行A,再执行B,然后循环往复。其中Is A变量表示当前是否正在执行A。

需要注意的是,该节点如果在函数中运行,结果可能不正确。因为它依靠内部变量IsA决定当前该执行什么,而函数结束后该变量就会被删除。

Sequence节点

按顺序执行连接到输出引脚的所有操作:

For Each Loop节点

遍历数组中的每一个元素,并作为输出供循环使用:

Do Once节点

仅执行一次输出引脚,若再次被触发,其输出引脚不会被执行。可以通过触发Reset引脚来重置该节点的状态。

Do N节点

允许执行输出引脚N次,若超过触发次数,其输出引脚不会被执行,可通过触发Reset引脚重置该节点的状态。

Gate节点

具有内部状态,如果触发时处于打开状态,则执行输出引脚,否则触发时不执行输出引脚。

它的输入引脚的含义如下:

  • Enter:接收执行流的执行引脚;
  • Open:将Gate状态设置为打开的执行引脚;
  • Close:将Gate状态设置为关闭的执行引脚;
  • Toggle:用于反转Gate状态的执行引脚;
  • Start Closed:决定Gate的初始状态;

MultiGate节点

触发它时,其中一个输出引脚将会被执行。可以是按顺序的,也可以是随机的,也可以是循环的。

它的输入引脚含义如下:

  • Reset:重置输出引脚的索引为Start Index,如果它为-1,那么重置为0;
  • Is Random:按随机顺序输出;
  • Loop:True则循环重复执行输出引脚,False则在所有输出引脚均被执行一次后停止允许;

参考资料

  • 中文翻译:《UE5蓝图可视化脚本游戏开发完全学习教程》
  • 英文原版:《Blueprints Visual Scripting for Unreal Engine 5 Third Edition》