Files
pixelheros/.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励UI集成.md
panw 4235e3b776 refactor(game): 移除已弃用的事件常量
- 删除 UpdateHero 和 UpdateFightHero 事件
- 移除 MISSION_UPDATE 事件常量
- 优化游戏事件枚举定义
2025-10-28 16:15:47 +08:00

167 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 奖励UI集成
<cite>
**本文档中引用的文件**
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts)
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
- [Design.md](file://assets/script/Design.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概述](#架构概述)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本文档详细说明了MissionComp组件如何与胜利界面Victory进行集成重点分析了oops.gui.open(UIID.Victory)调用时传递rewards和game_data参数的具体实现。文档解释了胜利界面如何解析这些数据并渲染三选一奖励选项描述了从战斗结束到奖励界面展示的完整用户流程包括延迟调度scheduleOnce的时间控制策略。同时提供了UI数据绑定错误的诊断方法并给出了自定义奖励展示效果的扩展建议。
## 项目结构
项目结构显示了游戏的核心脚本位于assets/script/game目录下其中map子目录包含了MissionComp和VictoryComp等关键组件。这些组件通过ECS架构进行组织实现了战斗逻辑与UI展示的分离。资源文件和配置文件分别存放在resources和config目录中形成了清晰的模块化结构。
```mermaid
graph TB
subgraph "Assets"
subgraph "Script"
subgraph "Game"
subgraph "Map"
MissionComp --> VictoryComp
MissionComp --> TopComp
MissionComp --> GuideSetpComp
end
subgraph "Common"
SingletonModuleComp --> GameEvent
SingletonModuleComp --> GameUIConfig
end
end
end
subgraph "Resources"
subgraph "Config"
NetCodeJson --> MapJson
end
LanguageJson --> ZhJson
end
end
```
**Diagram sources**
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts)
**Section sources**
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
## 核心组件
核心组件包括MissionComp和VictoryComp分别负责战斗逻辑管理和胜利界面展示。MissionComp组件通过事件系统监听战斗状态变化在战斗结束后触发胜利界面的打开并传递奖励数据。VictoryComp组件接收这些数据并在onAdded方法中进行处理实现奖励选项的动态渲染。
**Section sources**
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L17-L150)
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L74)
## 架构概述
系统采用ECS实体-组件-系统架构模式通过事件驱动机制实现组件间的通信。战斗逻辑与UI展示完全分离MissionComp作为战斗逻辑控制器负责管理战斗状态和奖励生成VictoryComp作为UI控制器负责解析和展示奖励数据。这种架构设计提高了代码的可维护性和可扩展性。
```mermaid
graph LR
A[MissionComp] --> |dispatchEvent| B[GameEvent.FightEnd]
B --> C[VictoryComp]
C --> |open UIID.Victory| D[奖励界面]
D --> |用户选择| E[奖励应用]
E --> |dispatchEvent| F[GameEvent.MissionEnd]
F --> G[游戏状态更新]
```
**Diagram sources**
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L116)
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L74)
## 详细组件分析
### MissionComp分析
MissionComp组件是战斗逻辑的核心控制器负责管理整个战斗流程。当英雄死亡或战斗结束时该组件会触发相应的事件处理函数并通过oops.gui.open方法打开胜利界面。
#### 战斗结束流程
```mermaid
sequenceDiagram
participant MissionComp as MissionComp
participant VictoryComp as VictoryComp
participant OopsGUI as oops.gui
MissionComp->>MissionComp : do_hero_dead()
MissionComp->>MissionComp : check hero_num <= 0
MissionComp->>MissionComp : dispatchEvent(FightEnd)
MissionComp->>OopsGUI : open(UIID.Victory, args)
OopsGUI->>VictoryComp : instantiate victory prefab
VictoryComp->>VictoryComp : onAdded(args)
VictoryComp->>VictoryComp : parse rewards and game_data
```
**Diagram sources**
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L32-L70)
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L74)
### VictoryComp分析
VictoryComp组件负责胜利界面的展示和交互处理。该组件通过onAdded方法接收来自MissionComp的数据参数并在界面上渲染相应的奖励选项。
#### 数据传递与解析
```mermaid
flowchart TD
Start([UI打开]) --> OnAdded["onAdded(args)"]
OnAdded --> CheckArgs{"args存在?"}
CheckArgs --> |是| ParseGameData["解析game_data"]
ParseGameData --> UpdateUI["更新UI元素"]
UpdateUI --> ScheduleNext["scheduleOnce显示next按钮"]
ScheduleNext --> End([界面就绪])
CheckArgs --> |否| DefaultValues["使用默认值"]
DefaultValues --> UpdateUI
```
**Diagram sources**
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L37)
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts#L9-L22)
## 依赖分析
组件间的依赖关系清晰明确MissionComp依赖于GameEvent和UIID枚举来触发界面切换VictoryComp依赖于SingletonModuleComp来访问全局游戏数据。这种依赖关系通过import语句在代码中显式声明确保了模块间的松耦合。
```mermaid
graph TD
A[MissionComp] --> B[GameEvent]
A --> C[UIID]
A --> D[SingletonModuleComp]
E[VictoryComp] --> F[GameEvent]
E --> G[SingletonModuleComp]
E --> H[ItemComp]
D --> I[vmdata]
G --> I
```
**Diagram sources**
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33)
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L37)
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L0-L41)
**Section sources**
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33)
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L37)
## 性能考虑
系统在性能方面采用了多种优化策略。首先通过scheduleOnce方法实现了界面元素的延迟显示避免了瞬间大量UI更新带来的性能冲击。其次组件的销毁通过reset方法完成确保了内存的及时释放。最后事件系统的使用减少了组件间的直接调用降低了耦合度和性能开销。
## 故障排除指南
当遇到UI数据绑定错误时应首先检查数据传递路径。确保MissionComp中的rewards和game_data字段正确初始化并在oops.gui.open调用时作为参数传递。在VictoryComp的onAdded方法中验证args参数是否包含预期的数据字段。如果问题仍然存在检查SingletonModuleComp中的vmdata结构是否与UI绑定要求一致。
**Section sources**
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L74)
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#37-L87)
## 结论
MissionComp与Victory界面的集成通过清晰的事件驱动机制和数据传递模式实现。系统利用scheduleOnce方法控制界面元素的显示时机提供了流畅的用户体验。通过分析代码结构和数据流可以有效诊断和解决UI集成中的常见问题并为自定义奖励展示效果提供扩展基础。