UE5 蓝图学习计划 - Day 9:数组与跨蓝图通信

在游戏开发中,数据存储与传递 是构建复杂系统的重要基础。UE5 蓝图提供了 数组(Array) 来存储多个数据项,并允许 跨蓝图通信(Blueprint Communication) 让不同的蓝图共享和传递数据。本篇将学习如何使用数组记录道具,并通过跨蓝图通信更新 UI,最终实现一个完整的 道具拾取系统。

理论学习

  1. 数组(Array)
    • 数组是 多个相同类型数据的集合,用于存储和管理多个对象。例如:
      • 记录玩家拾取的 道具列表。
      • 存储关卡中的 敌人 Actor,用于管理敌人状态。
    • 常见的数组操作
      • Add(增加):向数组添加元素。
      • Remove(移除):删除特定元素。
      • Contains(检查):检查数组是否包含特定元素。
      • ForEach(遍历):循环访问数组中的所有元素。
  2. 跨蓝图通信(Blueprint Communication)
    • 在 UE5 蓝图中,不同的蓝图通常需要 共享数据,例如:
      • 角色蓝图(Character)与 UI 蓝图(Widget)通信,更新道具栏。
      • 关卡蓝图(Level Blueprint)与道具蓝图(Pickup Item)交互,触发事件。
    • 常见的蓝图通信方式
      1. Direct Blueprint Communication(直接通信)
        • 适用于 两个已知蓝图实例 之间的数据交互,例如角色与 UI 之间的通信。
      2. Blueprint Interface(蓝图接口)
        • 适用于 多个蓝图共享通用方法,例如所有道具都使用同一套拾取逻辑。
      3. Event Dispatchers(事件广播)
        • 适用于 蓝图之间的事件通知,如当角色拾取道具时通知 UI 更新。

实践任务:创建道具拾取系统,并在 UI 显示拾取的物品

目标

  1. 角色拾取道具
    • 角色靠近道具时,按下 F 键拾取。
    • 拾取后,道具从场景中消失,并存入数组。
  2. 道具列表 UI
    • 使用 跨蓝图通信 将道具信息传递到 UI 蓝图。
    • 在 UI 上动态显示已拾取的道具。

步骤 1:创建道具蓝图

  1. 创建 BP_PickupItem
    1. 在 Content Browser 创建一个新的 Actor 蓝图,命名为 BP_PickupItem。
    2. 在 Components 面板 添加:
      • Static Mesh(道具模型)
      • Box Collision(检测拾取范围)
    3. 修改StaticMesh模型,以及Box的大小
  1. 添加变量

    • ItemName(String):道具名称(如 "钥匙")。
    • IsPlayerNearby(Boolean):玩家是否在拾取范围内。
  2. 设定拾取逻辑

    在 事件图(Event Graph) 中:

    • OnActorBeginOverlap(进入触发区域)

      • IsPlayerNearby = True
    • OnActorEndOverlap(离开触发区域)

      • IsPlayerNearby = False
    • 按 F 拾取

      • 检查 IsPlayerNearby 是否为 True
      • 调用角色蓝图的方法 AddItemToInventory (方法创建步骤在下面)
      • 销毁自身(DestroyActor)

步骤 2:创建角色的道具存储

  1. 修改 BP_PlayerCharacter
    1. 在 My Blueprint 面板,添加一个新变量:

      • Inventory(Array 类型,元素为 String)。
    2. 创建一个 自定义函数 AddItemToInventory:

      • 输入参数:ItemName(String)
      • 逻辑
        • 使用 Add 节点,将 ItemName 添加到 Inventory 数组。

步骤 3:创建 UI 蓝图

  1. 创建WBP_Text

    1. 在 Content Browser右键,选择User Interface,选择Widget Blueprint,创建 Widget Blueprint,命名为 WBP_Text。
    2. 添加Text组件并将名称命名为ItemName,勾选Is Variable
  2. 创建 WBP_Inventory

    1. 在 Content Browser右键,选择User Interface,选择Widget Blueprint,创建 Widget Blueprint,命名为 WBP_Inventory。


    2. 双击打开,在 UI 设计界面:

      • 添加 Canvas Panel (画布)。
      • 添加 Vertical Box(用于存放道具列表)勾选Is Variable。

  3. 点击右上角的Graph切换到蓝图界面,创建 UpdateInventoryUI 方法

    • 参数:InventoryArray(String 数组)
    • 逻辑
      • 清空现有 UI 列表
      • ForEach 遍历 InventoryArray
      • 创建WBP_Text 组件,并将道具名称设置给WBP_Text里的Text组件
      • 将创建的组件添加到VerticalBox中

步骤 4:实现跨蓝图通信

  1. 角色调用 UI 更新
    1. 在 BP_PlayerCharacter 中:

      • 添加变量 InventoryUI(类型为 WBP_Inventory)。

      • 在 Begin Play 事件中,创建 WBP_Inventory 的实例,并添加到屏幕:

      • 绑定到 InventoryUI 变量。

    2. 更新 UI

      • 在 AddItemToInventory 方法中,调用 InventoryUI -> UpdateInventoryUI(Inventory)。

步骤 5:测试与优化

  1. 将BP_PickupItem放到场景中,运行游戏,角色靠近道具,按 F 拾取。
  2. 拾取后,道具从场景中消失,UI 道具栏 更新。

学习收获

通过今天的学习,你掌握了:

  1. 数组的基本用法(添加、移除、遍历)。
  2. 跨蓝图通信(角色和 UI 之间的数据传递)。
  3. 完整的道具拾取系统(交互、存储、UI 更新)。

下一步学习计划

接下来,我们将学习 HUD UI 设计,包括血量条、得分系统和更丰富的 UI 交互!敬请期待!

相关推荐
喜欢吃燃面6 分钟前
C++算法竞赛:位运算
开发语言·c++·学习·算法
传奇开心果编程7 分钟前
【传奇开心果系列】Flet框架实现的家庭记账本示例自定义模板
python·学习·ui·前端框架·自动化
_Kayo_6 小时前
node.js 学习笔记3 HTTP
笔记·学习
CCCC13101639 小时前
嵌入式学习(day 28)线程
jvm·学习
星星火柴93610 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
小狗爱吃黄桃罐头10 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
艾莉丝努力练剑11 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
武昌库里写JAVA12 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
杜子不疼.12 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习
小幽余生不加糖13 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频