167 lines
7.5 KiB
Markdown
167 lines
7.5 KiB
Markdown
# 奖励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集成中的常见问题,并为自定义奖励展示效果提供扩展基础。 |