虚幻引擎结构体(Struct) 和枚举(Enum)及数据表(Data Table)

第一部分:创建蓝图版“枚举”和“结构体”

步骤 1:创建枚举(Enum)资产

  • 内容浏览器中,右键点击空白处。

  • 从菜单中选择 蓝图(Blueprints) -> 枚举(Enumeration)

1创建枚举

  • 将其命名为 EN_ItemRarity(建议加前缀 EN_ 便于识别)。

  • 双击打开它,在枚举编辑器中点击 添加枚举器 按钮,依次添加:

    • Common(普通)

    • Uncommon(优秀)

    • Rare(稀有)

    • Epic(史诗)

    • Legendary(传说)

2添加枚举值

  • 你可以在右侧描述中添加中文(如“普通”),方便查看。

  • 编译并保存

步骤 2:创建结构体(Structure)资产

  • 在内容浏览器中,右键 -> 蓝图(Blueprints) -> 结构体(Structure)

  • 将其命名为 S_ItemRow(建议加前缀 S_)。

图片[3]_虚幻引擎结构体(Struct) 和枚举(Enum)及数据表(Data Table)_虚幻引擎

  • 双击打开结构体编辑器,点击 新增变量(Add Variable),添加以下字段(注意修改变量类型):

    • ItemID(类型:Name)—— 用作唯一标识。

    • DisplayName(类型:Text)—— 游戏内显示名称。

    • Rarity(类型:搜索并选择我们刚建的 EN_ItemRarity 枚举)。

4添加结构体

    • Price(类型:Integer)。

    • Icon(类型:Texture2D,如果需要图标引用)。

5结构体

  • 保持每个变量为 可编辑,否则在数据表里看不见。

可编辑

  • 编译并保存


第二部分:创建数据表(Data Table)

  • 在内容浏览器中,右键 -> 其他 -> 数据表(Data Table)

7创建数据表

  • 在弹出的“选择行结构”窗口中,搜索并选择我们刚创建的 S_ItemRow 结构体,点击 选择(Select)

8选择结构体

  • 将新数据表命名为 DT_Items

  • 双击打开数据表编辑器,开始填充数据:

    • 点击 添加行(Add Row),将行名称(Row Name)设为 Potion_Health(注意:这是代码查找用的Key,区分大小写)。

9修改行命名

    • 在对应的列中:ItemID 填 Potion_HealthDisplayName 填 生命药水Rarity 列会自动变成下拉菜单,直接选择 CommonPrice 填 50

10填写行信息

    • 再添加一行 Sword_Iron,稀有度选 UncommonDisplayName 填 铁剑生命药水,价格填 200

    • 添加完成后保存

11新增一行信息


第三部分:在蓝图中读取数据(纯蓝图节点用法)

现在我们来创建一个 Actor,让它读取这张数据表。

  • 创建蓝图类:右键 -> 蓝图类(Blueprint Class),父类选择 Actor,命名为 BP_ItemSpawner

12创建蓝图类actor

  • 打开蓝图,在 我的蓝图(My Blueprint) 面板中点击 + 新建变量:

    • 变量名:ItemDataTable,类型选择 数据表(Data Table)

13新增变量

    • 在右侧 细节(Details) 面板中,将该变量的默认值指定为我们刚创建的 DT_Items

14选择数据表

  • 进入事件图表(Event Graph),从 BeginPlay 节点开始拖线,按以下逻辑连接节点:

    • 拖出 ItemDataTable 变量节点。

15开始事件图表

    • 从该节点拖出引脚,搜索并添加 获取数据表行(Get Data Table Row) 节点。选择资产那里选择表格。

Get Data Table Row

17选中表格

    • 在该节点的 行名称(Row Name) 输入框中,手动输入 Potion_Health(务必与数据表里的行名大小写完全一致)。

    • 关键点:该节点的 输出结构(Out Struct) 引脚类型就是 S_ItemRow(它会自动识别)。

    • 从 Out Struct 引脚拖出,搜索并添加 断开结构体(Break S_ItemRow) 节点(会自动展开所有字段)。

18获取表格结构

    • 从断开的结构体中,拖出 DisplayName 和 Price 引脚,连接到 打印字符串(Print String) 节点。(注意:Text类型需要用 ToString 节点转换一下)。

19_1打印测试

  • 编译保存,将 BP_ItemSpawner 拖入游戏关卡中。

19_2拖入场景

  • 运行游戏,屏幕上会打印出“生命药水”和“50”。

20运行显示的信息


第四部分:纯蓝图必须注意的“坑”与补救技巧

由于纯蓝图没有C++的编译时强校验,操作时请注意以下三点:

  1. 结构体修改不同步(最常见的Bug)

    • 如果已经创建了数据表 DT_Items,之后又去修改了结构体 S_ItemRow(比如新增了一个字段或改了类型),数据表不会自动更新

    • 解决方法:在数据表 DT_Items 上右键,选择 重新导入结构体(Reimport Struct) 或 刷新(Refresh),否则打开数据表时会看到红字报错。

  2. 行名称(Row Name)是查找的唯一凭证

    • 在C++中可以用枚举做Key,但在纯蓝图中,Get Data Table Row 节点只接受字符串/Name输入。建议将行名称和结构体里的 ItemID 填写成一致的字符串,避免混淆。

  3. 数据表输出的是“副本”而非引用

    • Get Data Table Row 节点的 Out Struct 输出的是该行数据的拷贝。你修改蓝图中断开后的变量,不会影响数据表里的原始数据,无需担心误改。


补充:如果不想用“行名称”硬编码字符串

如果你觉得手动输入 Potion_Health 字符串容易打错,可以在蓝图里再创建一个枚举(如 E_ItemName),把所有的物品ID列进去。然后使用 Get Data Table Row 时,先用 枚举转名称(Enum to Name) 节点转换,再连入行名称引脚,这样就能通过下拉菜单选择了。


总结一下纯蓝图的全流程口诀:“右键建枚举,右键建结构,数据表选结构,Get节点打断它”

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容