# 奖励数据流 **本文档引用文件** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts) - [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts) - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts) - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts) - [Mon.ts](file://assets/script/game/hero/Mon.ts) ## 目录 1. [引言](#引言) 2. [奖励数据生命周期](#奖励数据生命周期) 3. [rewards数组存储格式与UI展示](#rewards数组存储格式与ui展示) 4. [game_data对象累加逻辑](#game_data对象累加逻辑) 5. [数据同步策略](#数据同步策略) 6. [数据丢失问题调试](#数据丢失问题调试) 7. [结论](#结论) ## 引言 本文档系统阐述了奖励数据在MissionComp组件中的完整生命周期管理过程。从data_init方法初始化rewards数组和game_data对象开始,到do_drop方法接收掉落物品参数并更新数据结构的全过程。详细解释了rewards数组的存储格式设计及其与UI展示的对应关系,分析了game_data对象中exp、gold、diamond字段的累加逻辑与数据一致性保障机制,说明了MissionComp与全局状态管理smc.vmdata.mission_data的数据同步策略,并提供了数据丢失问题的调试方法。 ## 奖励数据生命周期 奖励数据在MissionComp组件中的生命周期始于任务开始时的初始化,终于任务结束时的数据清理。整个生命周期通过事件驱动的方式进行管理,确保数据的准确性和一致性。 ```mermaid flowchart TD A["任务开始 MissionStart"] --> B["data_init初始化"] B --> C["do_drop接收掉落物品"] C --> D["更新rewards数组"] D --> E["更新game_data对象"] E --> F["任务结束 FightEnd"] F --> G["数据同步到全局状态"] G --> H["打开胜利界面"] ``` **Diagram sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L150) **Section sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L150) ## rewards数组存储格式与UI展示 rewards数组用于存储任务过程中获得的所有掉落物品信息。该数组在data_init方法中被初始化为空数组,随着任务进行逐步填充。数组的设计考虑了后续UI展示的需求,每个元素代表一个掉落物品。 ```mermaid classDiagram class MissionComp { +rewards : any[] +game_data : any +data_init() +do_drop(drop_item[], game_data) } class VictoryComp { +rewards : any[] +game_data : any +onAdded(args) } MissionComp --> VictoryComp : "传递数据" ``` 当任务结束时,rewards数组作为参数传递给胜利界面(VictoryComp),实现数据的跨组件传递。这种设计模式确保了奖励数据的完整性和可追溯性。 **Diagram sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33) - [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L37) **Section sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33) - [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L37) ## game_data对象累加逻辑 game_data对象包含exp、gold、diamond三个核心字段,用于记录任务过程中的经验值、金币和钻石奖励。这些数据的累加逻辑通过do_drop方法实现,确保每次获得奖励时都能正确更新。 ```mermaid flowchart LR A["do_drop方法"] --> B["接收game_data参数"] B --> C{"参数有效性检查"} C --> |有效| D["累加exp、gold、diamond"] C --> |无效| E["使用默认值{exp:0,gold:0,diamond:0}"] D --> F["更新本地game_data对象"] F --> G["数据一致性保障"] ``` 数据一致性通过以下机制保障: 1. 初始化时设置默认值 2. 参数传递时提供默认值 3. 事件驱动更新,避免直接修改 4. 任务结束时统一同步到全局状态 **Diagram sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L32-L70) **Section sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L32-L70) ## 数据同步策略 MissionComp组件与全局状态管理smc.vmdata.mission_data之间采用事件驱动的数据同步策略。当特定事件发生时,相关数据会被同步到全局状态,确保数据的一致性和可访问性。 ```mermaid sequenceDiagram participant MissionComp participant smc_vmdata participant VictoryComp MissionComp->>MissionComp : data_init() MissionComp->>smc_vmdata : 初始化mission_data状态 MissionComp->>MissionComp : do_drop(drop_item, game_data) MissionComp->>MissionComp : 更新本地数据 MissionComp->>smc_vmdata : 同步关键状态(如mon_num) MissionComp->>VictoryComp : FightEnd事件 VictoryComp->>VictoryComp : 接收rewards和game_data VictoryComp->>smc_vmdata : 最终数据持久化 ``` 除了直接的奖励数据,其他任务相关状态如怪物数量(mon_num)、英雄数量(hero_num)等也会同步到全局状态,为其他组件提供必要的上下文信息。 **Diagram sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L116) - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136) - [Mon.ts](file://assets/script/game/hero/Mon.ts#L57-L93) **Section sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L116) - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136) - [Mon.ts](file://assets/script/game/hero/Mon.ts#L57-L93) ## 数据丢失问题调试 为确保奖励数据的完整性和可靠性,需要建立系统的调试方法来检测和解决潜在的数据丢失问题。以下是常见的调试策略和检查点: ```mermaid flowchart TD A["数据丢失问题"] --> B["检查事件监听"] A --> C["验证数据初始化"] A --> D["确认数据传递"] A --> E["检查异常处理"] B --> B1["MissionStart事件是否正确触发"] B --> B2["do_drop事件参数是否完整"] B --> B3["FightEnd事件是否携带数据"] C --> C1["data_init是否清空rewards数组"] C --> C2["game_data是否重置为默认值"] D --> D1["胜利界面是否正确接收参数"] D --> D2["数据结构是否匹配"] E --> E1["异常情况下数据是否保存"] E --> E2["网络中断时的恢复机制"] ``` 关键调试检查点包括: 1. 确认data_init方法在每次任务开始时都被正确调用 2. 验证do_drop方法接收的参数格式是否符合预期 3. 检查FightEnd事件触发时是否正确传递了rewards和game_data 4. 确保异常情况下(如游戏崩溃)有适当的数据恢复机制 5. 验证全局状态smc.vmdata.mission_data的更新时机和内容 **Diagram sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L114-L150) - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L47-L86) **Section sources** - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L114-L150) - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L47-L86) ## 结论 MissionComp组件中的奖励数据管理采用了一套完整的生命周期管理体系。通过data_init方法初始化数据结构,do_drop方法处理奖励更新,最终通过事件机制将数据传递给胜利界面展示。rewards数组和game_data对象的设计充分考虑了UI展示需求和数据一致性要求。与全局状态管理smc.vmdata.mission_data的同步策略确保了数据的可靠性和可访问性。为防止数据丢失,建议建立完善的调试机制,重点关注事件触发、数据初始化、参数传递和异常处理等关键环节。