# BP_InventoryComp ## 基本信息 - **类型**: Blueprint (ActorComponent) - **父类**: ActorComponent - **源文件**: /Game/Blueprints/Playground/BP_InventoryComp.BP_InventoryComp - **模块**: Content/Blueprints/Playground ## 功能概述 BP_InventoryComp 是库存管理组件,包装了一个 UDefaultContainer 实例,持有物品视图缓存和视图变化委托,提供物品创建和视图更新功能。它是物品系统与 Actor 之间的桥梁组件,也是 IInventory 接口的蓝图实现者。 ## 设计用意 BP_InventoryComp 将库存功能封装为可复用的 ActorComponent,使任何 Actor 都可以通过添加此组件来获得库存能力。它通过 DefaultContainer 引用底层存储,通过 ViewCache 缓存物品视图避免重复生成,通过 OnViewChanged 委托通知 UI 更新。这种设计将库存管理从具体的 Actor 类型中解耦出来,提高了可复用性。 ## 职责范围 BP_InventoryComp 负责持有并管理 UDefaultContainer 实例、维护 FItemView 缓存、处理物品创建和视图更新、以及实现 IInventory 接口的蓝图逻辑。底层物品存储机制由 UDefaultContainer 处理,物品类型定义由 DataTable 负责。 ## 项目内依赖 | 依赖项 | 关系 | 源文件 | |--------|------|--------| | UDefaultContainer | 持有 (DefaultContainer) | Item 插件 | | BP_DefaultContainer | 默认实例 | /Game/Blueprints/Playground/BP_DefaultContainer | | FItemView | 缓存 (ViewCache) | Item 插件 | | IInventory | 实现 | Item 插件 | ## 外部视角 BP_InventoryComp 是 ActorComponent 的子类(无 C++ 父类),从外部调用者视角: **公开属性(蓝图可读写)** - `DefaultContainer`(UDefaultContainer*)— 关联的物品容器实例 - `ViewCache`(TArray)— 物品视图缓存 **公开委托** - `OnViewChanged`(多播委托)— 视图变化时广播,外部可绑定。触发时机:物品创建、移动、移除等导致 ViewCache 变更时 **自定义函数** - `UpdateViewCache()` — 从 DefaultContainer 刷新 ViewCache 并触发 OnViewChanged - `CreateItemInternal(FName ItemType, int32 Count)` → `bool` — 创建指定类型和数量的物品并放入容器 **外部交互方式** - 作为组件添加到 Actor(如 BP_Barrel、BP_NewChar) - UI 层(WBP_InventoryView)通过 Comp 变量引用,读取 ViewCache 渲染列表,绑定 OnViewChanged 监听变化 - 其他系统通过组件引用的方式获取 BP_InventoryComp 并进行物品操作 **EventGraph 事件** | 事件 | 类型 | 触发时机 | 行为 | |------|------|----------|------| | `事件开始运行` | 原生覆盖 (BeginPlay) | 组件创建时由引擎自动触发 | 创建 BP_DefaultContainer → 判断网络权限:服务器端执行 GetOwner → Cast 到 Pawn → Controller → PlayerController → HUD → BP_Hud → InvView → BindToComp | | `CreateItemRPCReplicated` | 自定义事件 (RPC, Server) | 客户端请求创建物品时 | 接收 ItemType 和 Count → 通过 IItemContainer 接口创建物品 | | `MoveItemRPCReplicated` | 自定义事件 (RPC, Server) | 客户端请求移动物品时 | 接收 TargetInventory 和 ItemID → 通过 IInventory 接口移动物品到目标容器 | | `UpdateViewCacheRPCReplicated` | 自定义事件 (RPC, Server) | 客户端请求刷新视图时 | 从 DefaultContainer 获取 ItemViews → 更新 ViewCache | | `SyncViewCacheRPCReplicated` | 自定义事件 (RPC, All) | 服务器同步视图到所有客户端时 | 接收服务器端 ViewCache → 更新本地 ViewCache → 调用 OnViewChanged 委托通知 UI | | `Client RPC` | 自定义事件 (RPC, Client) | 服务器通知客户端刷新 UI 时 | 获取 Owner → Cast 到 Pawn → Controller → PlayerController → HUD → BP_Hud → InvView → BindToComp | ## 使用方法 BP_InventoryComp 在项目中的典型调用流程: - **库存初始化流程** — Actor(如 BP_Barrel)的 BP_InventoryComp 组件创建 → BeginPlay → 创建 BP_DefaultContainer → 服务端连接 HUD 的 InvView 绑定 UI - **物品创建流程** — 客户端请求创建物品 → CreateItemRPCReplicated(RPC 到服务器)→ 通过 IItemContainer.CreateItem 创建 → 服务器触发 SyncViewCacheRPC → 更新所有客户端 ViewCache → OnViewChanged 通知 UI - **UI 绑定流程** — WBP_InventoryView.BindToComp → 设置 Comp 变量引用 → 绑定 OnViewChanged 委托 → 库存变化时自动调用 UpdateListItems ## 用例 BP_InventoryComp 被 11 个文件引用(项目内最广泛的组件之一),按用途分类: | 引用方 | 路径 | 用途 | |--------|------|------| | WBP_InventoryView | `/Game/Blueprints/UI/Item/WBP_InventoryView` | 读取 ViewCache 渲染 UI,绑定 OnViewChanged 自动刷新 | | BP_DropItemInvComp | `/Game/Blueprints/Playground/BP_DropItemInvComp` | 继承为掉落物组件,增加 Item 变量 | | BP_Barrel | `/Game/Blueprints/Playground/BP_Barrel` | 组件实例,管理木桶内物品 | | BP_InventoryDrop | `/Game/Blueprints/Playground/BP_InventoryDrop` | 组件实例,管理掉落物品 | | BP_ItemTrap | `/Game/Blueprints/Playground/BP_ItemTrap` | 组件实例,管理陷阱物品 | | BP_TestItem | `/Game/Blueprints/Playground/BP_TestItem` | 组件实例,测试物品管理 | | BP_Bomb | `/Game/Blueprints/Playground/BP_Bomb` | 组件实例,管理炸弹物品 |