赞
踩
UE4中存在许多不同的变量类型,浮点
,布尔
,整数
,字符串
,等等。我们赋予变量意义,用于处理程序的运行,在需要很多意义相同的数据时,我们会应用数组的概念来储存一系列相同类型的数据。但是对于数组中的元素,其的类型是固定不变的唯一一种,而在实际的问题中我们往往需要多个不同类型的变量,这时我们就可以运用结构体来存储一系列不同类型的数据
在主视口内容浏览器右键→蓝图→结构即可创建结构体,打开结构体,可以在结构编辑器中编辑结构体所包含的变量
在蓝图中创建变量后,可以在右方的细节面板的变量类型中,搜索创建的结构体名称来将变量类型修改为结构体变量
将结构体拖入蓝图中,从结构体引脚拖出即可看到 中断 节点,之前说过,结构体相当于很多变量的聚合,而中断节点便是将结构体打碎,获得结构体的各个成员的数据
有打碎,就有相应的聚合节点,在节点搜索框中搜索 创建+(结构体名称) 便可以获得创建结构体节点,输出为变量类型为当前结构体的数据
前面说过,结构体本质上是变量,所以也可以进行设置变量的操作, 在节点搜索框中搜索 设置+(结构体名称) ,或者按住Alt从变量列表中拖出
注意:设置节点对于结构体变量进行的是整体设置,所以当创建节点中有变量节点没有连接时,依然会对其进行设置,但是在游戏中我们并不是每次都要修改结构体变量中所有的成员,如果每次都进行整体设置,那整个蓝图就会变得很乱。
这时,我们就要用到另一个节点 设置(结构体)成员
刚刚拖出的节点中,没有任何结构体中的变量,这时点击节点框,在右边的细节面板中可以勾选结构体中需要更改的变量,而没有勾选的变量则不会进行设置
对于结构体这种变量,当然也是可以创建数组的,结构体数组的节点操作和普通数组的节点操作相似,这里提及节点并说一些结构体数组特殊的地方
节点:get(复制) get(引用)
获取第n个元素(n为绿色引脚序号)
Get(复制)获取的是该元素的复制,不会改变元素本身
Get(引用)直接反映到元素本身,会改变元素
在数组中时,设置结构体成员仍然可用,但是如果需要整体设置需要 设置By-Ref变量
也可以使用 设置阵列元素 节点直接对数组进行操作
绿色引脚:元素索引
蓝色引脚:输入值
红色引脚:在索引大于数组范围时是否自动扩充数组
节点:Add AddUnique(4.25中为中文 添加 添加唯一 )
Add:在数列中增加一个新元素(蓝色引脚输入)
AddUnique:在数列中增加一个不重复的新元素(蓝色引脚输入)如果数组中已经有相同元素,则不增加
绿色引脚:输出新增加的元素的索引
插入节点:Insert(4.25中为中文 插入)
绿色引脚:插入元素的索引
蓝色引脚:输入的插入元素
移除节点:Remove Index Remove Item
(4.25中为中文 移除索引 移除项目)
Remove Index:移除索引位置上的元素
Remove Item:移除输入值的所有元素
红色引脚:输出是否有元素被删除,如果有,则为ture
寻找节点:FindItem ContainsItem
(4.25中为中文 寻找项目 包含项目)
FindItem:输出结果为元素的索引,如果没有找到则输出-1
ContainsItem:输出结果为是否找到,既ture或者false
注意!:寻找节点在对于结构体数组时必须每一个成员都完全相同才行,这是非常重要的,详细的会在下面的案例中讲到
随机化节点:Shuffle(4.25为中文 随机)
将数组中的元素随机排序
遍历节点:ForEachLoop ForEachLoopWithBreak
两个节点都是对输入数组进行循环,本质上是For循环,循环次数为数组的元素个数,ForEachLoopWithBreak节点既是带了Break的For循环
蓝色引脚:当前循环的元素
绿色引脚:当前元素的索引
Completed:循环完后的流程运行
为方便理解,这里用一个背包系统(B站UP主五花畅视频)的案例进行讲解
首先,一个背包就是装“物品”的“容器”,而每一种“物品”有拥有许多的属性:名称,数量,图标,模型,这些都是不同的变量,而“容器”中所装的都是拥有着四个属性的,于是理清思路,对于不同变量的“物品”,我们创建一个结构体来描述他,并在人物蓝图中创建这个结构体的数组作为背包“容器”。
在游戏中,我们的背包并不是随时都是满的,而没有装东西的格子便是“空的”,虽然我们说的时候是空的,但本质上“空位”本身也是一个元素,因为对于一个数组的长度,只有在有元素时才有意义,所以在没有其他物品时我们也会用空物品的元素去占据他,在人物蓝图中创建一个新的物品结构体变量当作空物品,然后在人物的构造函数中用 ForLoop 节点对背包进行初始化设定
这时我们就在游戏运行开始前获得了一个初始索引为0,末端索引为19的(既大小为20)的数组,且全部用“空物品”填充。这里为什么不用 ForEachLoop 呢?因为在这里的数组大小在创建时默认为0,所以用最简单的For循环来填充。
在人物蓝图中创建一个新的自定义事件,在右边的细节面板中增加两个整数类型输入变量,分别用于扔出物品索引和扔出物品数量。
分析逻辑:首先判断输入的扔出物品数量,如果小于0,则不进行任何操作。接着遍历整个数组,找到索引和扔出物品相同的元素,判断扔出物品数量和背包里元素物品数量的大小关系,如果大于,则全部扔出,既是用空物品结构体代替扔出物品,如果小于,则将扔出物品的数量设置为原数量-输入量
在人物蓝图中创建一个新的自定义事件,在右边的细节面板中添加输入变量:结构体和整数,结构体用于判断捡起的物品,整数用于判断捡起的数量
分析逻辑:捡起物品后遍历整个数组寻找在背包中和输入物品名称相同的物品,注意:在这里不能使用 FindItem 来寻找和输入物品相同的元素,只能先中断输入的物品,单独对比名称的成员。前面我们提到过 FindItem 用于结构体数组时,必须所有成员完全相同才行,但是这个结构体中还包含了整数变量:数量,所以不能使用此节点
如果遍历找到以后,便可以连接设置成员,将数量设置为两者相加(图中我写的时候脑子抽了,用了设置整体,别学)
但是如果最先的时候我们背包中没有相同的物品呢?我们就需要在背包中找一个空格子放进去,既是当遍历完成时若还没放进去就找空格子,所以我们需要一个信号去判断是否找到了相同的物品。新建一个布尔来进行判断
接下来我们只需要在结束遍历时判断布尔的值就行了,如果没有找到,就用 FindItem 来寻找空格子然后 设置By-Ref变量 就行了。在最后的语句,我们判断了 FindItem 的输出值是否等于-1,因为在没有找到的情况下,既是返回值为-1,既是背包已经没有空格子。
注:这个背包系统并不完整,本篇只截取了涉及结构体相关的部分,如对整个系统有兴趣,请移步B站视频
(ps:这里是我个人的絮絮叨叨,这个UP主讲的真的好,除了声音有点小,就是最近没录教程了,残念)
1.虚幻引擎4入门|虚幻引擎文档
2.【五花畅】UE4背包教程
Learn By Doing
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。