# 奖励UI集成 **本文档中引用的文件** - [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) ## 目录 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集成中的常见问题,并为自定义奖励展示效果提供扩展基础。