7.9 KiB
7.9 KiB
CodeX TODO
最后更新:2026-03-07
当前目标
按 docs/CombatNodeArchitecture.md 收敛 CombatNode 域职责,重点是:
CombatScheduler收敛为“状态机管理器”,不再继续堆业务细节。- 局内
Coin / Gold / BaseHp / Loot Backpack / BuildTowerSnapshots由CombatInRunResourceManager作为唯一真值来源。 EnemyManager只上报敌人事件,不直接决定资源入账或状态切换。PhaseEndType退出条件从PhaseLoopRuntime中抽离到IPhaseEndCondition实现类。- 结束链、加载链、奖励选择链逐步从
CombatScheduler.cs本体挪到状态类或专用服务。
已完成
1. 状态类拆分完成
CombatScheduler.cs内部的嵌套状态类已经迁移到Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatStates/。- 保留了
partial class CombatScheduler + 嵌套类的结构。 - 旧
CombatState已统一替换为CombatStateBase。
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatStates/CombatStateBase.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatStates/*.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(...)
- 不再通过
CombatNodeComponent读写 baseHp/coin 真值
CombatNodeComponent
- 不再持有这些字段:
_currentCoin_currentGold_currentBaseHp_currentBuildTowerStats
- 当前只保留:
- 关卡数据缓存
CurrentLevel / CurrentThemeType- 战斗启动/结束协调
- 最终结算摘要字段(
LastDefeatedEnemyCount / LastGainedCoin / LastGainedGold) - 对
CombatScheduler的只读/操作转发
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.cs
还没完成
1. EnemyManager 事件边界还没改干净
当前仍然存在的问题:
EnemyManager还在自己计算droppedCoin / droppedGold / baseDamage- 然后把这些原始数值直接传给
CombatScheduler
目标状态:
EnemyManager只上报:OnEnemyDefeated(DREnemy enemy)OnEnemyReachedBase(DREnemy enemy)
CombatScheduler统一调用:EnemyDropResolverCombatInRunResourceManager
下一步建议:
- 先改
EnemyManager上报签名 - 再把 coin/gold/baseDamage 的公共副作用挪到
CombatScheduler
2. PhaseEndCondition 骨架已建,但还没接入
当前仍然是旧逻辑:
PhaseLoopRuntime.ShouldEndCurrentPhase(...)还在使用CombatWaitingForPhaseEndState还没有改成通过IPhaseEndCondition判定
目标状态:
PhaseLoopRuntime只保留 phase runtime 数据CombatWaitingForPhaseEndState通过PhaseEndConditionFactory.Create(...)获取当前判定器PhaseEndType的规则不再写在PhaseLoopRuntime里
3. CombatScheduler 本体仍然过重
当前仍然还在 CombatScheduler.cs 里的业务:
- 结算上下文构建
- 基地血量结算修正
- 奖励选择 UI 准备
- FinishForm 打开逻辑
- 一部分加载和清理编排
目标状态:
Loading负责加载和MapData组装Settlement负责结算上下文和奖励准入判断RewardSelection只处理选择流程FinishForm只处理展示WaitingForReturn只处理回退和最终清理
4. MapData + Event 解耦还没开始
当前:
MapData只有LevelIdMapEntity仍通过GameEntry.CombatNode反查 coin / build stats
目标状态:
CombatLoadingState从CombatInRunResourceManager读取快照CombatLoadingState组装更完整的MapDataMapEntity后续通过MapData + Event获取上下文,而不是反查CombatNode
推荐的后续执行顺序
- 改
EnemyManager上报边界,接入EnemyDropResolver - 接入
IPhaseEndCondition,移除PhaseLoopRuntime.ShouldEndCurrentPhase(...) - 把结算链逻辑从
CombatScheduler.cs继续剥离到状态类 - 开始做
MapData + Event解耦
当前做变更时要记住的约束
- 状态切换只能通过
CombatScheduler.ChangeState(...) - 不要把新业务继续堆回
CombatScheduler.cs CombatNodeComponent现在应该保持轻量 facade,不要再把 coin/baseHp/build snapshot 回流到它- coin/baseHp 变化事件应继续由
CombatInRunResourceManager发布 Failed只处理异常失败,不处理“基地血量归零”的正常失败路径
当前关键入口文件速查
- 状态机宿主:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs
- 局内资源真值:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.cs
- 状态类:
Assets/GameMain/Scripts/CustomComponent/CombatNode/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
备注
- 当前环境没有可用的本地 C# 编译器(
dotnet / mcs / csc / msbuild / xbuild都不可用),所以本轮改动主要依赖文本级检查。 - 仓库目前有一些与本任务无关的脏文件,继续改动时只聚焦
CombatNode相关文件即可,不要顺手回滚无关改动。