当前位置:   article > 正文

【UE4】蓝图结构体入门及案例_ue4 蓝图结构

ue4 蓝图结构

结构体

  • 结构体是什么?

UE4中存在许多不同的变量类型,浮点布尔整数字符串,等等。我们赋予变量意义,用于处理程序的运行,在需要很多意义相同的数据时,我们会应用数组的概念来储存一系列相同类型的数据。但是对于数组中的元素,其的类型是固定不变的唯一一种,而在实际的问题中我们往往需要多个不同类型的变量,这时我们就可以运用结构体来存储一系列不同类型的数据
在这里插入图片描述

(图1-各种类型的变量)
注意!:虽然我们在这里将结构体与数组进行对比,但仍需要记住的是结构体仍然是一个变量,他是一个将许多变量类型聚合在自己体内的新变量,下面关于糖果与盒子的将生动的给你展示两者的区别

结构体仍然是变量

(图2-结构体仍然是变量)
  • 创建结构体

在主视口内容浏览器右键→蓝图→结构即可创建结构体,打开结构体,可以在结构编辑器中编辑结构体所包含的变量

创建结构体

(图3-创建结构体)

修改包含的成员

(图4-修改结构体包含的成员)
  • 结构体相关的节点

在蓝图中创建变量后,可以在右方的细节面板的变量类型中,搜索创建的结构体名称来将变量类型修改为结构体变量

在这里插入图片描述

(图5-修改变量为创建的结构体变量)

1.中断(结构体)/创建(结构体)

将结构体拖入蓝图中,从结构体引脚拖出即可看到 中断 节点,之前说过,结构体相当于很多变量的聚合,而中断节点便是将结构体打碎,获得结构体的各个成员的数据
中断节点

(图6-中断节点)

打碎,就有相应的聚合节点,在节点搜索框中搜索 创建+(结构体名称) 便可以获得创建结构体节点,输出为变量类型为当前结构体的数据

2.修改结构体中的变量

前面说过,结构体本质上是变量,所以也可以进行设置变量的操作, 在节点搜索框中搜索 设置+(结构体名称) ,或者按住Alt从变量列表中拖出

设置节点

(图7-设置节点)
在实际操作中,我们一般会在左边的蓝色引脚处接上创建结构体的节点,这样就可以对结构体中不同类型的变量操作后再整体进行设置了。

接上创建使用

(图8-接上创建节点一起使用)

注意:设置节点对于结构体变量进行的是整体设置,所以当创建节点中有变量节点没有连接时,依然会对其进行设置,但是在游戏中我们并不是每次都要修改结构体变量中所有的成员,如果每次都进行整体设置,那整个蓝图就会变得很乱。

仍然进行了设置

(图9-整体设置)

这时,我们就要用到另一个节点 设置(结构体)成员

设置成员

(图10-设置结构体成员)

刚刚拖出的节点中,没有任何结构体中的变量,这时点击节点框,在右边的细节面板中可以勾选结构体中需要更改的变量,而没有勾选的变量则不会进行设置

勾选引脚

(图11-细节面板勾选引脚)
  • 结构体数组的相关注意

对于结构体这种变量,当然也是可以创建数组的,结构体数组的节点操作和普通数组的节点操作相似,这里提及节点并说一些结构体数组特殊的地方

1.获取数组中元素

节点:get(复制) get(引用)
获取第n个元素(n为绿色引脚序号)
Get(复制)获取的是该元素的复制,不会改变元素本身
Get(引用)直接反映到元素本身,会改变元素

两种Get节点

(图12-两种Get节点)

2.修改结构体中变量

在数组中时,设置结构体成员仍然可用,但是如果需要整体设置需要 设置By-Ref变量

两种设置节点

(图13-两种设置节点)

也可以使用 设置阵列元素 节点直接对数组进行操作
绿色引脚:元素索引
蓝色引脚:输入值
红色引脚:在索引大于数组范围时是否自动扩充数组

设置矩阵元素

(图14-设置矩阵元素)

3.增加数列中的元素

节点:Add AddUnique(4.25中为中文 添加 添加唯一
Add:在数列中增加一个新元素(蓝色引脚输入)
AddUnique:在数列中增加一个不重复的新元素(蓝色引脚输入)如果数组中已经有相同元素,则不增加
绿色引脚:输出新增加的元素的索引
两种添加

(图15-两种添加节点)

4.数组的元素操作

插入节点:Insert(4.25中为中文 插入
绿色引脚:插入元素的索引
蓝色引脚:输入的插入元素
插入节点

(图16-插入节点)

移除节点:Remove Index Remove Item
(4.25中为中文 移除索引 移除项目
Remove Index:移除索引位置上的元素
Remove Item:移除输入值的所有元素
红色引脚:输出是否有元素被删除,如果有,则为ture
两种移除

(图17-两种移除)

寻找节点:FindItem ContainsItem
(4.25中为中文 寻找项目 包含项目
FindItem:输出结果为元素的索引,如果没有找到则输出-1
ContainsItem:输出结果为是否找到,既ture或者false
注意!:寻找节点在对于结构体数组时必须每一个成员都完全相同才行,这是非常重要的,详细的会在下面的案例中讲到

两种寻找节点

(图18-两种寻找节点)

随机化节点:Shuffle(4.25为中文 随机
将数组中的元素随机排序

随机节点

(图19-随机节点)

遍历节点:ForEachLoop ForEachLoopWithBreak
两个节点都是对输入数组进行循环,本质上是For循环,循环次数为数组的元素个数,ForEachLoopWithBreak节点既是带了Break的For循环
蓝色引脚:当前循环的元素
绿色引脚:当前元素的索引
Completed:循环完后的流程运行

(图20-两个遍历节点)
  • 整个案例

为方便理解,这里用一个背包系统(B站UP主五花畅视频)的案例进行讲解

1.明确流程

首先,一个背包就是装“物品”的“容器”,而每一种“物品”有拥有许多的属性:名称数量图标模型,这些都是不同的变量,而“容器”中所装的都是拥有着四个属性的,于是理清思路,对于不同变量的“物品”,我们创建一个结构体来描述他,并在人物蓝图中创建这个结构体的数组作为背包“容器”。

创建的物品结构体

(图21-创建的物品结构体)

2.初始化背包

在游戏中,我们的背包并不是随时都是满的,而没有装东西的格子便是“空的”,虽然我们说的时候是空的,但本质上“空位”本身也是一个元素,因为对于一个数组的长度,只有在有元素时才有意义,所以在没有其他物品时我们也会用空物品的元素去占据他,在人物蓝图中创建一个新的物品结构体变量当作空物品,然后在人物的构造函数中用 ForLoop 节点对背包进行初始化设定

初始化背包

(图22-初始化背包)

这时我们就在游戏运行开始前获得了一个初始索引为0,末端索引为19的(既大小为20)的数组,且全部用“空物品”填充。这里为什么不用 ForEachLoop 呢?因为在这里的数组大小在创建时默认为0,所以用最简单的For循环来填充。

3.扔出物品

在人物蓝图中创建一个新的自定义事件,在右边的细节面板中增加两个整数类型输入变量,分别用于扔出物品索引和扔出物品数量。
分析逻辑:首先判断输入的扔出物品数量,如果小于0,则不进行任何操作。接着遍历整个数组,找到索引和扔出物品相同的元素,判断扔出物品数量和背包里元素物品数量的大小关系,如果大于,则全部扔出,既是用空物品结构体代替扔出物品,如果小于,则将扔出物品的数量设置为原数量-输入量

扔出物品的逻辑蓝图

(图23-扔出物品的逻辑蓝图)
在扔出物品后,我附加了一个自定义事件CreatItem备用,因为在扔出物品后,不仅背包中发生变化,场景中也会对应生成扔出的物品,这个自定义事件用于后续完善(此处不多详解)

4.捡起物品

在人物蓝图中创建一个新的自定义事件,在右边的细节面板中添加输入变量:结构体和整数,结构体用于判断捡起的物品,整数用于判断捡起的数量
分析逻辑:捡起物品后遍历整个数组寻找在背包中和输入物品名称相同的物品,注意:在这里不能使用 FindItem 来寻找和输入物品相同的元素,只能先中断输入的物品,单独对比名称的成员。前面我们提到过 FindItem 用于结构体数组时,必须所有成员完全相同才行,但是这个结构体中还包含了整数变量:数量,所以不能使用此节点

不能使用FindItem

(图24-不能使用FindItem)

如果遍历找到以后,便可以连接设置成员,将数量设置为两者相加(图中我写的时候脑子抽了,用了设置整体,别学)
但是如果最先的时候我们背包中没有相同的物品呢?我们就需要在背包中找一个空格子放进去,既是当遍历完成时若还没放进去就找空格子,所以我们需要一个信号去判断是否找到了相同的物品。新建一个布尔来进行判断

对于是否找到的判断

(图25-对于是否找到的判断)

接下来我们只需要在结束遍历时判断布尔的值就行了,如果没有找到,就用 FindItem 来寻找空格子然后 设置By-Ref变量 就行了。在最后的语句,我们判断了 FindItem 的输出值是否等于-1,因为在没有找到的情况下,既是返回值为-1,既是背包已经没有空格子。

5.总图

总图

注:这个背包系统并不完整,本篇只截取了涉及结构体相关的部分,如对整个系统有兴趣,请移步B站视频
(ps:这里是我个人的絮絮叨叨,这个UP主讲的真的好,除了声音有点小,就是最近没录教程了,残念)

相关参考资料

1.虚幻引擎4入门|虚幻引擎文档
2.【五花畅】UE4背包教程

最后

Learn By Doing

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/133372?site
推荐阅读
相关标签
  

闽ICP备14008679号