7.5 KiB
奖励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)目录
简介
本文档详细说明了MissionComp组件如何与胜利界面(Victory)进行集成,重点分析了oops.gui.open(UIID.Victory)调用时传递rewards和game_data参数的具体实现。文档解释了胜利界面如何解析这些数据并渲染三选一奖励选项,描述了从战斗结束到奖励界面展示的完整用户流程,包括延迟调度(scheduleOnce)的时间控制策略。同时提供了UI数据绑定错误的诊断方法,并给出了自定义奖励展示效果的扩展建议。
项目结构
项目结构显示了游戏的核心脚本位于assets/script/game目录下,其中map子目录包含了MissionComp和VictoryComp等关键组件。这些组件通过ECS架构进行组织,实现了战斗逻辑与UI展示的分离。资源文件和配置文件分别存放在resources和config目录中,形成了清晰的模块化结构。
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
Section sources
核心组件
核心组件包括MissionComp和VictoryComp,分别负责战斗逻辑管理和胜利界面展示。MissionComp组件通过事件系统监听战斗状态变化,在战斗结束后触发胜利界面的打开,并传递奖励数据。VictoryComp组件接收这些数据并在onAdded方法中进行处理,实现奖励选项的动态渲染。
Section sources
架构概述
系统采用ECS(实体-组件-系统)架构模式,通过事件驱动机制实现组件间的通信。战斗逻辑与UI展示完全分离,MissionComp作为战斗逻辑控制器,负责管理战斗状态和奖励生成;VictoryComp作为UI控制器,负责解析和展示奖励数据。这种架构设计提高了代码的可维护性和可扩展性。
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分析
MissionComp组件是战斗逻辑的核心控制器,负责管理整个战斗流程。当英雄死亡或战斗结束时,该组件会触发相应的事件处理函数,并通过oops.gui.open方法打开胜利界面。
战斗结束流程
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
VictoryComp分析
VictoryComp组件负责胜利界面的展示和交互处理。该组件通过onAdded方法接收来自MissionComp的数据参数,并在界面上渲染相应的奖励选项。
数据传递与解析
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
依赖分析
组件间的依赖关系清晰明确,MissionComp依赖于GameEvent和UIID枚举来触发界面切换,VictoryComp依赖于SingletonModuleComp来访问全局游戏数据。这种依赖关系通过import语句在代码中显式声明,确保了模块间的松耦合。
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
Section sources
性能考虑
系统在性能方面采用了多种优化策略。首先,通过scheduleOnce方法实现了界面元素的延迟显示,避免了瞬间大量UI更新带来的性能冲击。其次,组件的销毁通过reset方法完成,确保了内存的及时释放。最后,事件系统的使用减少了组件间的直接调用,降低了耦合度和性能开销。
故障排除指南
当遇到UI数据绑定错误时,应首先检查数据传递路径。确保MissionComp中的rewards和game_data字段正确初始化,并在oops.gui.open调用时作为参数传递。在VictoryComp的onAdded方法中,验证args参数是否包含预期的数据字段。如果问题仍然存在,检查SingletonModuleComp中的vmdata结构是否与UI绑定要求一致。
Section sources
结论
MissionComp与Victory界面的集成通过清晰的事件驱动机制和数据传递模式实现。系统利用scheduleOnce方法控制界面元素的显示时机,提供了流畅的用户体验。通过分析代码结构和数据流,可以有效诊断和解决UI集成中的常见问题,并为自定义奖励展示效果提供扩展基础。