13 KiB
13 KiB
CodeX TODO
最后更新:2026-03-07
当前目标
按 docs/CombatNodeArchitecture.md 继续收敛 CombatNode 域职责。当前骨架已经基本到位,后续重点是:
- 继续保持
CombatScheduler作为唯一状态机边界,避免把新业务重新堆回本体。 - 继续完成
MapData + Event解耦收尾,确认MapEntity不再反查CombatNode域运行时。 - 稳定
CombatSettlementContext的模型边界,避免流程控制字段和展示摘要继续混杂增长。 - 补 Unity 编译、PlayMode 和失败路径回归验证,把这轮结构调整真正跑通。
已完成
1. 状态类已收口到 CombatScheduler/CombatStates
- 状态类当前位于
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/。 CombatStateBase已统一改为Context + Flow双引用模式。- 各状态不再直接访问
CombatScheduler._xxx私有字段,而是通过:CombatSchedulerRuntimeContextCombatSchedulerFlowCoordinator
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatStateBase.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/*.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerRuntimeContext.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.cs
2. 第一轮目标命名、骨架与接线已建立
CombatResourceManager已重命名为CombatInRunResourceManager。- 已新增掉落解析骨架:
EnemyDropResolveContextEnemyDropResolveResultEnemyDropResolver
- 已新增 phase end 骨架并接入等待退出状态:
IPhaseEndConditionPhaseEndConditionContextPhaseEndConditionFactoryNonePhaseEndConditionTimeElapsedPhaseEndConditionEnemiesClearedPhaseEndConditionBossDeadPhaseEndCondition
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/EnemyDropResolver.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseEndConditions/
3. 局内资源真值已迁到 CombatInRunResourceManager
目前 CombatInRunResourceManager 已经接管:
CurrentCoinCurrentBaseHpMaxBaseHpGainedCoinGainedGold- 本局
BuildTowerStats快照 - 奖励背包快照
已实现的资源接口:
InitializeForCombat(DRLevel level)MarkCombatEnded()Reset()TryConsumeCoin(int coin)AddCoin(int coin)ApplyBaseDamage(int damage)TryGetBuildTowerStats(int buildIndex, out TowerStatsData stats)AddEnemyDefeatedReward(int gainedCoin, int gainedGold)AddSettlementGold(int gainedGold)GetRewardInventorySnapshot()
附带完成:
CombatCoinChangedEventArgs增加了DeltaCoinCombatBaseHpChangedEventArgs增加了DeltaBaseHp- coin/baseHp 变化事件现在由
CombatInRunResourceManager发布,而不是CombatNodeComponent Reset()现在会清理ParticipantTowerInstanceIds
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.csAssets/GameMain/Scripts/Event/Combat/CombatCoinChangedEventArgs.csAssets/GameMain/Scripts/Event/Combat/CombatBaseHpChangedEventArgs.cs
4. CombatScheduler / CombatNodeComponent 已做一轮收口
CombatScheduler
- 启动时会先初始化
CombatInRunResourceManager - 提供资源转发属性:
CurrentCoinCurrentGoldCurrentBaseHpCurrentBuildTowerCount
- 提供资源转发方法:
TryConsumeCoin(...)AddCoin(...)TryGetBuildTowerStats(...)
- 失败调试入口:
TryDebugFail(...)
- 不再通过
CombatNodeComponent读写 baseHp/coin 真值 - 当前主职责已收紧为:
- 生命周期入口
- 状态切换入口
- 对外公开查询/操作接口
- 敌人事件公共入口
- 事件桥回调入口
CombatScheduler 内部实现细化
- 已新增
CombatSchedulerRuntimeContext- 承载共享运行时字段与共享服务引用
- 已新增
CombatSchedulerFlowCoordinator- 承载多个状态共用的流程辅助方法
- 当前
CombatScheduler本体不再直接堆所有共享字段和公用流程辅助
CombatNodeComponent
- 不再持有这些字段:
_currentCoin_currentGold_currentBaseHp_currentBuildTowerStats
- 当前只保留:
- 关卡数据缓存
CurrentLevel / CurrentThemeType- 战斗启动/结束协调
- 最终结算摘要字段(
LastDefeatedEnemyCount / LastGainedCoin / LastGainedGold) - 对
CombatScheduler的只读/操作转发
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerRuntimeContext.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.cs
5. EnemyManager 事件边界已改为只上报敌人事实
EnemyManager现在只向CombatScheduler上报:OnEnemyDefeated(DREnemy enemy)OnEnemyReachedBase(DREnemy enemy)
- coin/gold/baseDamage 的公共副作用已统一收口到
CombatScheduler EnemyDropResolver + CombatInRunResourceManager已接到公共敌人事件入口上
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/EnemyManager/EnemyManager.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/EnemyDropResolver.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs
6. PhaseEndCondition 已正式接入 WaitingForPhaseEnd
CombatWaitingForPhaseEndState已改为通过:PhaseEndConditionFactory.Create(...)IPhaseEndCondition.ShouldExit(...)判定 phase 结束
PhaseLoopRuntime当前只保留 phase runtime 数据与 phase 进入逻辑,不再负责PhaseEndType判定
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatWaitingForPhaseEndState.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseEndConditions/Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseLoopRuntime.cs
7. 结束链与异常失败链已做协议收口
- 正常结束:
NodeCompleteEventArgs只在WaitingForReturn完成后发布
- 异常失败:
- 使用
CombatFailedState - 弹出单按钮
DialogForm - 点击
Return Menu后发布CombatFailureReturnEventArgs
- 使用
ProcedureMenu已区分正常结束与异常失败两条返回协议
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatWaitingForReturnState.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatFailedState.csAssets/GameMain/Scripts/Event/Combat/CombatFailureReturnEventArgs.csAssets/GameMain/Scripts/Procedure/ProcedureMenu.cs
8. CombatSettlementContext 已收紧为结束链共享上下文
- 当前由
Settlement -> RewardSelection -> FinishForm -> WaitingForReturn共享 - 已显式承载:
- 结算事实
- 奖励背包
- 奖励选择相关流程标记
- 低血惩罚相关事实
- 低血惩罚已改为“先记录事实,提交阶段再统一落库”,不再在结算构造期直接写库存
CombatFinishForm当前只消费它真正展示需要的摘要,不再把额外结算事实继续灌进 UI Context
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementContext.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementFlowService.csAssets/GameMain/Scripts/UI/Combat/UseCase/CombatFinishFormUseCase.cs
9. CombatInfoForm 已补手动失败测试入口
CombatInfoForm.OnFailButtonClick()可手动触发异常失败链- 新增
CombatDebugFailEventArgs - 当前可直接用于测试:
CombatFailedState- 失败 Dialog
CombatFailureReturnEventArgs
关键文件:
Assets/GameMain/Scripts/UI/Combat/View/CombatInfoForm.csAssets/GameMain/Scripts/UI/Combat/Controller/CombatInfoFormController.csAssets/GameMain/Scripts/UI/Combat/UseCase/CombatInfoFormUseCase.csAssets/GameMain/Scripts/Event/Combat/CombatDebugFailEventArgs.cs
还没完成
1. MapData + Event 解耦还没完全收口
当前:
CombatLoadingState已经会组装更完整的MapDataMapEntity已经主要从MapData取初始上下文- 但还需要继续确认地图侧事件和运行时依赖是否已经完全摆脱对
CombatNode域的反查
目标状态:
CombatLoadingState从CombatInRunResourceManager读取快照CombatLoadingState组装更完整的MapDataMapEntity后续通过MapData + Event获取上下文,而不是反查CombatNode
2. CombatScheduler 本体仍然还有收紧空间
当前:
- 生命周期入口、状态切换入口、对外公开接口、事件桥回调入口仍在
CombatScheduler.cs - 共享字段和共享流程已经拆到了
RuntimeContext + FlowCoordinator - 但
FlowCoordinator目前仍直接依赖CombatScheduler宿主对象
目标状态:
- 对外公开接口与内部宿主职责进一步分离
- 若继续收紧,可评估是否引入极小宿主接口,只暴露:
ChangeState(...)- 必要的回调/转发入口
- 继续避免把新业务重新塞回
CombatScheduler.cs
3. CombatSettlementContext 还可以继续整理字段分层
当前:
CombatSettlementContext已能支撑结束链- 但字段仍是平铺增长
目标状态:
- 更明确地区分:
- 流程控制字段
- 结算事实字段
- 展示摘要字段
- 避免后续继续把 UI 需求和流程控制混在一起
4. 需要补实际运行验证
当前改动已覆盖:
- 状态机结构
- 结束链/失败链协议
- 手动失败测试入口
CombatSchedulerRuntimeContext + CombatSchedulerFlowCoordinatorCombatSettlementContext与延迟提交惩罚
但仍缺:
- Unity 编译验证
- PlayMode/手点验证
- 失败路径回收验证
- 新开局后无残留状态验证
推荐的后续执行顺序
- 做
MapData + Event解耦收尾,排查MapEntity和地图侧事件是否还反查CombatNode - 评估是否给
FlowCoordinator引入极小宿主接口,继续收紧CombatScheduler本体 - 继续整理
CombatSettlementContext的字段分层 - 补 Unity 编译与手动回归验证
当前做变更时要记住的约束
- 状态切换只能通过
CombatScheduler.ChangeState(...) - 不要把新业务继续堆回
CombatScheduler.cs,优先考虑:- 状态私有逻辑
CombatSchedulerFlowCoordinator- 现有独立服务
CombatNodeComponent现在应该保持轻量 facade,不要再把 coin/baseHp/build snapshot 回流到它- coin/baseHp 变化事件应继续由
CombatInRunResourceManager发布 Failed只处理异常失败,不处理“基地血量归零”的正常失败路径- 状态类应继续只通过
CombatSchedulerRuntimeContext + CombatSchedulerFlowCoordinator访问共享状态与共享流程
当前关键入口文件速查
- 状态机宿主:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs
- 共享运行时承载:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerRuntimeContext.cs
- 共享流程协调:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.cs
- 局内资源真值:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.cs
- 状态类:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/
- 加载服务:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatLoadSession.cs
- phase runtime:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseLoopRuntime.cs
- phase end 条件骨架:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseEndConditions/
- 敌人域 facade:
Assets/GameMain/Scripts/CustomComponent/CombatNode/EnemyManager/EnemyManager.cs
- CombatNode 入口 facade:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.cs
- 结束链共享上下文:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementContext.cs
- 异常失败返回事件:
Assets/GameMain/Scripts/Event/Combat/CombatFailureReturnEventArgs.cs
备注
- 当前环境没有可用的本地 C# 编译器(
dotnet / mcs / csc / msbuild / xbuild都不可用),所以本轮改动主要依赖文本级检查。 - 仓库目前有一些与本任务无关的脏文件,继续改动时只聚焦
CombatNode相关文件即可,不要顺手回滚无关改动。