Files
zeling_v2/Docs/Plan/00_DevelopmentPlan.md
2026-05-08 11:04:00 +08:00

456 lines
28 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 开发实施计划
> **版本**1.0
> **日期**2026-04-29
> **依据**`Docs/Architecture/`24 份架构文档)
> **目标**:完整实现 `Docs/Design/` 所有技术需求
---
## 目录
1. [策略选择](#1-策略选择)
2. [整体阶段概览](#2-整体阶段概览)
3. [Phase 0项目基础](#3-phase-0项目基础)
4. [Phase 1垂直切片 MVP](#4-phase-1垂直切片-mvp)
5. [Phase 2核心玩法扩展](#5-phase-2核心玩法扩展)
6. [Phase 3世界与进程系统](#6-phase-3世界与进程系统)
7. [Phase 4内容与完善](#7-phase-4内容与完善)
8. [模块依赖顺序](#8-模块依赖顺序)
9. [技术风险与缓解策略](#9-技术风险与缓解策略)
---
## 1. 策略选择
### 为什么不用纯 MVP 先验证可行性?
纯 MVP 策略适合**架构未定型**的项目——先做最小功能,验证架构方向再继续。
本项目**架构已完全定型**24 份文档,类/接口/字段/方法全部明确),逻辑设计无需验证。真正的风险集中在:
| 风险点 | 内容 |
|--------|------|
| 第三方库集成 | Animancer Pro FSM、PathBerserker2d NavSurface、Behavior Designer AI 树三者协作 |
| SO 事件频道跨系统串联 | 首次接线需要验证整条链路Input→Player→Combat→Save→UI |
| Addressables 异步加载 | 场景 Additive 加载 + Persistent 常驻场景的 Load/Unload 时序 |
| Cinemachine + PixelPerfect | 相机切换与房间边界的实际表现 |
### 推荐:骨架垂直切片策略
```
Phase 0: 项目骨架(无可玩内容,但基础设施就绪)
Phase 1: 垂直切片 MVP一个可玩房间验证所有第三方集成点
Phase 2: 核心玩法扩展(在验证的骨架上填充完整战斗/移动系统)
Phase 3: 世界与进程系统(地图、存档、谜题、任务)
Phase 4: 内容与完善Boss 技能、叙事、支撑系统、平台发布)
```
每个 Phase 结束都有**可演示的里程碑**,但 Phase 0 之后的每一层都是在可运行的代码上追加,而非重写。
---
## 2. 整体阶段概览
| Phase | 目标 | 里程碑 | 预估周期 | 状态 |
|-------|------|--------|---------|------|
| **0** | 项目基础设施 | 编译无错,基础框架可寻址加载 | 1 周 | ✅ 完成2026-05-07|
| **1** | 垂直切片 MVP | 一个房间可玩:移动/攻击/一只敌人/存读档 | 34 周 | ✅ 完成2026-05-08|
| **2** | 核心玩法扩展 | 完整玩家能力树/战斗系统/多种敌人 | 45 周 | — |
| **3** | 世界与进程 | 完整地图/谜题/任务/商店 | 45 周 | — |
| **4** | 内容与完善 | Boss/叙事/平台服务/QA | 34 周 | — |
---
## 3. Phase 0项目基础
**目标**所有模块能编译Addressables/Assembly Definitions/SO 事件频道骨架就绪,无可玩内容。
### 任务清单
#### P0-1项目结构01_ProjectStructure
- [x] 按规范建立 `Assets/Scripts/``Assets/Data/``Assets/Prefabs/``Assets/Scenes/` 文件夹层级
- [x] 创建全部 Assembly Definition 文件(`BaseGames.Core``BaseGames.Core.Events``BaseGames.Core.Save``BaseGames.Input``BaseGames.Player``BaseGames.Player.States``BaseGames.Combat``BaseGames.Combat.StatusEffects``BaseGames.Parry``BaseGames.Enemies``BaseGames.Enemies.AI``BaseGames.World``BaseGames.UI``BaseGames.Audio``BaseGames.Progression``BaseGames.Feedback``BaseGames.Camera``BaseGames.Animation``BaseGames.Editor`
- [x] 验证 asmdef 依赖方向(低层不引用高层,`Core.Events` 无任何依赖)
- [x] 建立 `Persistent.unity` 场景骨架(空 GameObject 层级,待 Phase 1 填充组件)
#### P0-2SO 事件系统02_EventSystem
- [x] `BaseEventChannelSO<T>` 泛型基类
- [x] `VoidBaseEventChannelSO` 无负载基类
- [x] 所有具体频道类型(已创建):`VoidEventChannelSO``IntEventChannelSO``FloatEventChannelSO``BoolEventChannelSO``StringEventChannelSO``Vector2EventChannelSO``TransformEventChannelSO``GameStateEventChannelSO``SceneLoadRequestEventChannelSO``DifficultyChangedEventChannel``DamageInfoEventChannelSO``HitConfirmedEventChannelSO``ShopPurchaseEventChannelSO``DialogueEventChannelSO``LiquidEventChannelSO``WorldMarkerEventChannelSO``AbilityTypeEventChannelSO``AbilityType` payload`ColorBlindModeEventChannelSO``BossSkillEventChannelSO``BossPhaseEventChannelSO``StatusEffectEventChannelSO``QuestStateChangedEventChannel``QuestObjectiveEventChannelSO`
- [x] `ToolUsedEventChannelSO`payload`ToolUsedPayload { SlotIndex, ToolId }``Core/Events/ToolEvents.cs`;⚠️ 架构 09 §7.5 用 `Tool` 对象,实现用 `string ToolId` 避免跨程序集依赖)
- [x] `AchievementEventChannelSO`payload`AchievementSO``Progression/AchievementSO.cs`Phase 0 骨架Phase 4 扩充)
- [x]`Assets/Data/Events/` 下预建所有全局频道 `.asset` 资产(`CreateEventChannelAssets` Editor 菜单一键生成;对照 `02_EventSystem §4` 清单)
- [x] `EventSubscription` struct + `CompositeDisposable`(已实现;命名差异:架构用 `EventSubscriptionToken`/`DisposableSubscription`,实现用 `EventSubscription`/`CompositeDisposable`——功能等价)
- [x] `AddTo(ICollection<IDisposable>)` 扩展方法(`EventSubscriptionExtensions` 静态类;架构 02 §8
#### P0-3Core 骨架03_CoreModule
- [x] `GameStateId` struct + `IGameState` 接口 + `GameStateMachine`(替代旧 `GameState` 枚举;架构 03_CoreModule §2
- [x] `GameStates` 静态工厂8 个内置状态MainMenu/Gameplay/Paused/BossFight/Cutscene/Loading/Dead/GameOver
- [x] `IGameStateFactory` 接口(供 DLC/扩展注册自定义状态)
- [x] `GameStateEventChannelSO` payload 类型为 `GameStateId`(非旧 enum
- [x] `GameManager`(字段 + 接口签名Awake 暂留空,内嵌 `GameStateMachine`
- [x] `SceneLoader`(异步加载骨架,`LoadSceneAsync` 封装)
- [x] `SettingsManager` + `GlobalSettingsSO`
- [x] `GlobalObjectPool`(通用池,`Spawn<T>` / `Despawn``WarmupAsync` 批量预热)
- [x] `PooledObject` 组件
#### P0-3b服务层骨架03_CoreModule §11-13
- [x] `ServiceLocator` 静态类(`Register<T>` / `Get<T>` / `GetOrDefault<T>` / `OverrideForTest<T>` / `Reset`
- [x] `GameServiceRegistrar`ExecutionOrder -2000DontDestroyOnLoad`Awake` 中注册所有核心服务)
- [x] 五大服务接口:`IAudioService``ISaveService``ISceneService``IDeathRespawnService``IEventChannelRegistry`
- [x] `NullAudioService`(空实现,测试/Editor 下兜底,不报错)
- [x] `DeathRespawnService`(实现 `IDeathRespawnService`UniTask-based封装死亡/重生序列Phase 1 完成完整逻辑Day 3 只建文件+接口)
- [x] `SceneService`(实现 `ISceneService`UniTask-based封装场景加载Day 3 只建文件+接口)
#### P0-4资产加载骨架13_AssetPoolModule
- [x] `AddressKeys` 静态常量类(填入当前已知地址;后续持续追加)
- [x] `AssetLoader` 工具类(封装 `Addressables.LoadAssetAsync`
- [x] `AssetReleaseTracker`(场景卸载时批量 Release
- [x] `AddressKeyRegistry`(运行时 key 注册层DLC 扩展用;`TryRegister(key, addr)` / `Resolve(key)` / `TryResolve()` / `Unregister()` / `ForceRegister()``Core/Assets/AddressKeyRegistry.cs`;架构 13 §9
- [x] Editor 工具:`AddressKeyValidator`(反射扫描 `AddressKeys` 所有常量,对比 Addressable 分组)+ `AddressKeyImportWatcher``AssetPostprocessor`Addressable 分组变更后自动触发;`Editor/AddressKeyValidator.cs`;架构 13 §10
#### P0-5存档骨架12_SaveModule 部分)
- [x] `SaveData` C# 完整数据结构(所有子类:`SaveMeta``PlayerSaveData``WorldSaveData` 等)
- [x] `ISaveStorage` 接口 + `LocalFileStorage` 实现(⚠️ 类名无 "Save" 前缀,架构 12 §2
- [x] `SaveManager`(接口签名,`Save`/`Load`/`NewGame` 占位实现)
### Phase 0 完成标准
- Unity 编译无错Console 无警告
- 能在 Editor 中运行 `Persistent` 场景GameManager Awake 打印版本号)
- 能新建 / 加载 JSON 存档文件(即使数据为空)
- 所有 asmdef 引用方向通过 Assembly Reference Checker 验证
---
## 4. Phase 1垂直切片 MVP
**目标**:一个完整可玩房间。验证所有第三方库集成点,建立可以往上叠加的可运行骨架。
**可玩标准**:玩家能在一个房间内移动、跳跃、普通攻击;有一只巡逻敌人能被击杀;房间内有存档点可存读档;死亡后从存档点复活。
### 任务清单
#### P1-1输入系统04_InputModule
- [x] `InputReaderSO`(持有 `PlayerInputActions` 引用,暴露 Unity Events
- [x] `InputBuffer`(三路独立缓冲:`_jumpBufferDuration = 0.15f``_attackBufferDuration = 0.12f``_dashBufferDuration = 0.10f`
- [x] 配置 `PlayerInputActions.inputactions`Gameplay / UI / Cutscene 三套 Action Map存于 `Assets/Settings/PlayerInputActions.inputactions`
- [x]`Persistent` 场景挂载 `InputReader`
#### P1-2相机系统17_CameraModule
- [x] `CameraStateController`(管理 GlobalCam / RoomCam 优先级)
- [x] `RoomVisibleArea`(每个房间场景的 `CinemachineConfiner2D` 边界)
- [x] `CameraTriggerZone`(触发切换活跃相机)
- [x] `CameraConfigSO`Pixel Perfect 参数)
- [x] `CameraBlendProfileSO`(混合曲线配置 SO`ToBlendDefinition()` 返回 Cinemachine v3 结构体)
- [x] `RoomCamera`(单房间 VCam 封装,`Activate()`/`Deactivate()` 优先级切换)
- [x] 配置 Cinemachine Virtual Camera + Pixel Perfect Camera 组合Unity Editor 场景组装)
- [x] **验证点**:进入房间后相机锁定在正确边界,像素对齐无抖动
#### P1-3玩家模块——基础05_PlayerModule
目标Run/Jump/Fall/Idle/Attack 五个状态可运行
- [x] `PlayerController`(协调器字段 + Awake 注册 + Update 状态转发)
- [x] `PlayerMovement`Rigidbody2D 移动,走/跳/落地)
- [x] `PlayerStats`HP 字段,`TakeDamage` 接口)
- [x] `PlayerCombat`基础近战攻击触发HitBox 激活/停用)
- [x] `PlayerStateBase`(抽象基类;`PlayerStateMachine` 逻辑内嵌于 `PlayerController`
- [x] State 实现:`IdleState``RunState``JumpState``FallState``AttackState`(✅)
- [x] `PlayerAnimationConfigSO` + `PlayerMovementConfigSO`(基础数值)
- [x] `PlayerStatsSO`HP/灵力/弹簧/Geo 初始数值 SO
- [x] **Animancer 集成验证点**FSM 切换时 Animancer Linear 混合正常,无动画卡顿
#### P1-4战斗管道06_CombatModule
- [x] `DamageInfo` struct + `Builder`
- [x] 所有枚举(`DamageType``DamageCategory``DamageFlags``DamageTags``HitFxType``BreakLevel``PoiseLevel`;⚠️ `DamageTags``[Flags]` 枚举含 15 个标记位,`PoiseLevel` 均定义于架构 06_CombatModule §2
- [x] `DamageSourceSO`
- [x] `HitBox``OnTriggerEnter2D` → 收集重叠的 `HurtBox`,调用 `ReceiveDamage`
- [x] `HurtBox``ReceiveDamage` 管道:防御计算 → `IDamageable.TakeDamage`
- [x] `IDamageable` 接口
- [x] **伤害管道验证点**:玩家攻击命中敌人 HurtBox → 敌人 HP 减少Console 打印 DamageInfo 内容
#### P1-5基础敌人07_EnemyModule
目标:一只能巡逻、追玩家、被攻击、死亡的基础敌人
- [x] `EnemyBase``IDamageable``TakeDamage`/`Die`
- [x] `EnemyStats` + `EnemyStatsSO`(基础 HP/攻击力)
- [x] `EnemyMovement`Rigidbody2D配合 NavAgent
- [x] `EnemyNavAgent`(封装 PathBerserker2d `NavAgentComponent`
- [x] `EnemyCombat`(近战攻击区域,触发玩家 HurtBox
- [x] NavSurface 烘焙(测试房间地形)
- [x] Behavior Designer 任务类:`BD_Patrol``BD_MoveToPlayer``BD_Attack``BD_IsPlayerInRange`(⚠️ 类名以架构 07_EnemyModule §8 为准,非 BD_ChasePlayer/BD_AttackPlayer/BD_CheckPlayerDistance
- [x] 一份基础 BehaviorTree 资产Patrol → Detect → Chase → Attack
- [x] **PathBerserker2d + Behavior Designer 集成验证点**:敌人能在 NavSurface 上寻路追玩家
#### P1-6存档完整实现12_SaveModule
- [x] `SaveManager` 完整实现(`Save``Load``NewGame``DeleteSave`
- [x] `SavePoint` 场景组件(触发存档,广播 `_onSavePointActivated`
- [x] `ISaveable` 接口 + `PlayerSaveData` 读写HP、位置、当前场景
- [x] `SaveMigrator`(版本号检查)
- [x] `EmergencySaveService`(定时自动存档)
- [x] **存档验证点**Play → 激活存档点 → 退出 Play → 再 Play → 正确加载到存档位置
#### P1-7最简 UI10_UIModule
- [x] `UIManager`Panel 层级管理,`OpenPanel`/`CloseTopPanel`;⚠️ 非 `ShowPanel`/`HidePanel`,架构 10 §2
- [x] `HUDController`HP 条 + 当前货币;⚠️ 非 `HUDPanel`,架构 10 §3
- [x] 订阅 `_onHPChanged``_onGeoChanged` 事件频道更新 HUD 货币频道名为 `_onGeoChanged`,架构 10 §3
- [x] `DeathScreenController`(占位,显示"You Died";⚠️ 非 `DeathPanel`,架构 10 §6
#### P1-8最简音频钩子11_AudioModule
- [x] `AudioManager`(单例,`PlaySFX`/`PlayBGM` 接口)
- [x] `AudioMixerKeys`Exposed Parameter 常量类)+ `AudioConfigSO`(区域 BGM 映射)
- [x] `BGMController`(订阅 Zone/Boss 事件驱动 BGM 切换)+ `AudioZone`(区域切换触发)
- [x] 在伤害管道和死亡事件上挂上 SFX 钩子(`CombatSFXController` 订阅 `HitConfirmedEventChannelSO` + `_onPlayerDied`
#### P1-9VFX 最简18_VFXFeedbackModule 骨架)
- [x] `VFXPool`(基于 `GlobalObjectPool` 的 VFX 专用包装)
- [x] `HitFXSpawner`(根据 `DamageInfo.FxType` 路由到 VFX Prefab
- [x] `HurtFlashController`(白闪 Shader 参数控制)
- [x] `VFXCatalogSO`填入2-3个占位 Prefab
- [x] **验证点**:击中敌人时播放命中特效和白闪
#### P1-10死亡复活流程串联03_CoreModule §8
- [x] `GameManager` 完整实现死亡/复活时序
- [x] 接通事件链:`_onPlayerDied``GameManager.OnPlayerDied()``DeathScreenController` → 等待输入 → `SceneLoader.ReloadFromSave()`
### Phase 1 完成标准
| 验证项 | 要求 |
|--------|------|
| 玩家可移动/跳跃/攻击 | Animancer FSM 无卡顿 |
| 敌人能寻路追击攻击 | PathBerserker2d + Behavior Designer 无报错 |
| 攻击命中有 VFX 和音效 | 事件链完整 |
| 激活存档点,退出重进,正确复位 | SaveManager JSON 读写正确 |
| 玩家死亡 → 死亡画面 → 复活 | GameManager 状态机流转正确 |
| 相机锁定房间,像素对齐 | 无亚像素抖动 |
| Console 无错误,无 MissingReference | — |
---
## 5. Phase 2核心玩法扩展
**目标**:在 Phase 1 的可运行骨架上,填充完整的玩家能力、战斗纵深、多种敌人。
### 任务清单
#### P2-1玩家完整 FSM05_PlayerModule 剩余)
- [ ] State 补充:`DashState``HurtState``DeadState``WallSlideState``WallJumpState``SwimState``21_LiquidPuzzleModule §SwimState`
- [ ] `FormController`三形态切换Normal/Soul/Spirit
- [ ] `WeaponManager``EquipAsync` 异步装备Socket 管理)
- [ ] `SkillManager`(技能槽 + 冷却计时)
- [ ] `SpringSystem`(头部弹簧摆动)
- [ ] Animancer 双层动画Base Layer移动动画+ Additive Layer攻击动画
#### P2-2护盾系统20_ShieldModule
- [x] `ShieldComponent`Phase 1 存根AbsorbDamage 全量穿透Phase 2 补完护盾值/再生/破盾事件)
- [ ] `ShieldConfigSO`MaxShieldHP、AbsorptionRatio、RechargeDelay、RechargeRate
- [x] `IShieldable` 接口(`CombatInterfaces.cs`
- [ ] `HurtBox.ReceiveDamage` 接入护盾管道HurtBox → ShieldComponent → IDamageable
- [ ] 护盾破碎/恢复 VFX 钩子
#### P2-3完整战斗系统06_CombatModule 剩余)
- [ ] `ProjectileConfigSO` + `LinearProjectile` + `ParryableProjectile`
- [ ] `ParrySystem`(弹反窗口、弹反成功/失败事件)+ `ParryConfigSO`
- [ ] `StatusEffectManager` + `StatusEffect`(抽象基类,架构 06_CombatModule §11`StatusEffectBase`+ 具体效果Poison、Burn、Freeze、Stun
- [ ] `PoiseSystem`霸体计数、Break 阈值)
- [ ] `IBreakable`(机关/障碍物交互接口)
- [ ] `ClashResolver`(拼刀系统:同帧玩家/敌人 HitBox 对碰检测,广播 `EVT_NailClash`;架构 06 §15
#### P2-4动画事件系统24_AnimEventModule
- [ ] `AnimationEventType` enum20+ 事件)
- [ ] `AnimationEventConfigSO`
- [ ] `AnimationEventBinder`
- [ ] `PlayerAnimationEvents`(挂在玩家上)
- [ ] `EnemyAnimationEvents`(挂在敌人上)
- [ ] `IAnimationEventHandler` 接口(⚠️ 非 `IAnimEventReceiver`,架构 24_AnimEventModule §1 patch
- [ ] 将 AttackState HitBox 激活时机从 FixedUpdate 改为 AnimEvent 驱动
- [ ] Editor 工具:`EventConfigEditor``[CustomEditor(typeof(AnimationEventConfigSO))]`时间轴标记点可视化、Clip 漂移检测(偏差>5帧警告、normalizedTime 越界保护、事件类型着色;架构 24 §10
#### P2-5完整 VFX 反馈18_VFXFeedbackModule 完整)
- [x] `FeedbackConfigSO``HurtFlashColor`/`HurtFlashDuration`Phase 2 扩充 Feel 封装字段)
- [x] `IFeedbackPlayer` 接口(完整 APIPlayHit/PlayTakeHit/PlayDeath/PlayHeal/PlayLandImpact 等)+ `PlayerFeedback``EnemyFeedback``NullFeedbackPlayer` 实现
- [ ] `VFXCatalogSO` 填入全部 VFX Prefab命中/死亡/技能/环境)
- [ ] 接通 Feel MMF_Player 到相机震动、控制器震动
#### P2-6难度系统19_DifficultyModule
- [ ] `DifficultyLevel` enum
- [ ] `DifficultyScalerSO` × 4 份资产Easy/Normal/Hard/SteelSoul
- [ ] `DifficultyManager``DefaultExecutionOrder: -900`
- [ ] `EVT_DifficultyChanged` 频道
- [ ] `PlayerStats`/`EnemyStats`/`ShopController` 订阅难度系数
- [ ] 钢铁之魂模式:一命锁定 + SaveData 标记
#### P2-7敌人扩展07_EnemyModule 剩余)
- [ ] `BossBase` + `BossOrchestrator`Phase 切换)
- [ ] `AttackPatternSO` + `TelegraphSystem`(攻击前摇标注)
- [ ] `DeathShade`(死亡遗骸 Prefab
- [ ] `LootTableSO`(战利品掉落配置 SO`BaseWeight``ScaleWithDifficulty`;架构 07 §14+ `LootResolver`(按概率掷骰)+ `LootPickup`(弧线飞行动画)
- [ ] `EnemyQuotaManager`(同屏最多 12 个活跃 BT每 10 帧重新评估优先级;架构 07 §13.5
- [ ] `BatchLOSSystem` + `ILOSRequester`Jobs+Burst 批量视线检测;超过 4 个活跃敌人时必须注册;架构 07 §15
- [ ] 敌人 Prefab 模板:远程弓箭手(含 Projectile 发射)
- [ ] `BD_` 任务类补充:`BD_FlyToTarget``BD_DropDown``BD_Teleport``BD_TelegraphAttack`
#### P2-8音频系统完整11_AudioModule 完整)
- [ ] `AudioEventSO`SFX 配置 SO持有 `AudioClip` + `volume` + `pitch` 随机化范围)
- [ ] `GlobalSFXPlayer`(全局静态 SFX 播放入口,配合对象池管理位置 SFX
- [ ] `AudioConfigSO` 完整填表(区域 BGM 映射 + 快照名称枚举)
- [ ] 为所有模块 SFX 钩子连接 `AudioEventSO`(替代直接传递 `AudioClip`
---
## 6. Phase 3世界与进程系统
**目标**:完整地图探索、谜题机关、任务系统、商店;存档数据完整;关卡编辑器工具就绪。
### 任务清单
#### P3-1世界模块完整08_WorldModule
- [ ] `RoomTransition`(门/传送Additive 场景加载/卸载)
- [ ] `HazardZone`(即死/持续伤害区域)
- [ ] `Collectible`Geo/物品,弧线吸附)
- [ ] `DestructibleTile`(三帧图集,三种触发条件)+ `DirectionalDestructible`
- [ ] `DirectionalInteractable`OneShot 持久化)
- [ ] `MovingPlatform`(三种 MoveType + 乘客 Parent 方案)
- [ ] `CrumblePlatform`(四态状态机 + NavLink 联动)
- [ ] `FalseWall`(三种揭示条件)
- [ ] `MagicWall`(仅 GizmoLayer Matrix 实现)
- [ ] `SoftTerrain`Marker 组件)
- [ ] `PhantomInteractable`(继承 `DirectionalInteractable`,响应 `PhantomBody` 层)
- [ ] `WorldStateRegistry`(运行时缓存已触发/已破坏状态)
#### P3-2液体与谜题系统21_LiquidPuzzleModule
- [ ] `LiquidZone` + `LiquidType` enum
- [ ] `LiquidPhysicsConfigSO`(浮力、水下速度)
- [ ] `SwimState`(已在 P2-1 添加到 FSM
- [ ] `ISwitchable``IActivatable` 接口
- [ ] `PuzzleSwitch``PuzzleReceiver`AND/OR/XOR 逻辑)、`PuzzleWire`(可视化连接)
- [ ] `WorldMarker` + `BreadcrumbTracker`(导航提示)
- [ ] `TutorialManager` + `ContextualHintTrigger`
#### P3-3进度系统09_ProgressionModule
- [ ] `AbilityGate`(能力锁区域,检查 `PlayerStats.unlockedAbilities`
- [ ] `AbilityUnlock`(解锁 Prefab播放解锁演出
- [ ] `CharmSO``CharmManager`(护符装备/卸载Slot 管理)
- [ ] `SkillSO``SpellSO`(技能/魔法数据)
- [ ] `ToolSlotManager`(两槽工具 + 冷却)+ `ToolHUD`
- [ ] `EquipmentManager`(武器/防具装备)
#### P3-4任务与挑战22_QuestChallengeModule
- [ ] `QuestSO``QuestObjectiveSO``RewardSO`
- [ ] `QuestManager`(进度追踪,订阅世界事件)
- [ ] `QuestGiver``IInteractable` NPC
- [ ] `ChallengeRoomSO``ChallengeEncounterSO``BossRushSequenceSO`
- [ ] `ChallengeRoomManager`
#### P3-5地图与商店15_MapShopModule
- [ ] `MapManager`(订阅 `EVT_RoomEntered` 事件,调用 `OnRoomEntered(string roomId)` 记录已探索房间;⚠️ 无 `RevealRoom` 公共方法,架构 15 §1.2 patch
- [ ] `MapDatabaseSO` + `MapRoomDataSO`(房间数据 SO`RoomRevealData`,架构 15 §1.1
- [ ] `MapUI`(房间格子渲染,玩家位置实时标记,破坏/机关状态叠加)
- [ ] `FastTravelSystem`(快速传送锚点)
- [ ] `ShopController``TryPurchase`,难度价格倍率接入)
- [ ] `ShopInventorySO`
- [ ] Editor 工具:`MapRoomDataEditor``[CustomEditor(typeof(MapRoomDataSO))]`Scene 句柄拖拽 GridPosition/GridSize消除手动整数对齐误差"居中 Scene View 到此房间"按钮;架构 15 §5P3 优化)
#### P3-6存档完善12_SaveModule 剩余)
- [ ] `CrashReporter` + `EmergencySaveService` 定时检点完整实现
- [ ] `SaveMigrator` 版本迁移策略v1→v2 字段兼容)
- [ ] 存档槽 UI新建/删除/选择存档)
---
## 7. Phase 4内容与完善
**目标**Boss 战系统、叙事/过场、平台服务层、本地化、Debug 工具,进入 QA 可测试状态。
### 任务清单
#### P4-1Boss 技能系统23_BossSkillModule
- [ ] `BossSkillSO``BossSkillType` enum
- [ ] `AttackPatternSO`(已在 P2-7 基础上扩展)
- [ ] `SkillSequenceSO`(多阶段技能编排)
- [ ] `BossSkillExecutor`
- [ ] `WeakPointSystem`(脆弱点组件,命中切换 Boss 阶段)
- [ ] `VulnerabilityWindow`
#### P4-2叙事系统14_NarrativeModule
- [ ] `DialogueManager`DialogueGraph SO 驱动)
- [ ] `CutsceneManager` + `CutsceneSO` + `CutsceneTrigger`
- [ ] `EventChainSO`(线性事件链触发器)
- [ ] `InteractableNPC` 基类(`IInteractable`,触发对话)
#### P4-3输入重绑定04_InputModule §6
- [ ] `RebindPanel`
- [ ] `RebindActionRow`
- [ ] `ConflictDetector`
- [ ] `RebindPersistence`(写入 `PlayerPrefs`
#### P4-4UI 完整10_UIModule 剩余)
- [ ] `PauseMenu`(设置/键位重绑定/退出)
- [ ] `InventoryPanel``EquipmentPanel``MapPanel``SkillPanel`
- [ ] Screen Transition Overlay黑屏淡入淡出
- [ ] `SaveSlotController` + `SaveSlotUI`(主菜单 3 槽存档卡片 UI架构 10 §7.5
- [ ] `LoadingOverlay`(全屏加载界面;订阅 `EVT_LoadingOverlay` BoolEventChannelSO架构 10 §8
- [ ] `FloatingDamageText`(对象池驱动的伤害数字飘字;架构 10 §10
- [ ] `ToastNotification`(成就/任务 Toast 弹出;架构 10 §11
- [ ] `InputDeviceIconSwitcher`(键盘/手柄按键图标切换;订阅 `EVT_InputDeviceChanged`;架构 10 §12
- [ ] 所有 Panel 层级配置(`UIManager.OpenPanel` 优先级;⚠️ 非 `ShowPanel`,架构 10 §2
#### P4-5支撑模块16_SupportingModules
- [ ] `LocalizationManager`CSV 表格驱动,`GetText(key)`
- [ ] `IPlatformService` ServiceLocator + `SteamPlatformService` + `NullPlatformService`
- [ ] `AchievementManager`(通过 `ServiceLocator.Get<IPlatformService>()` 接入平台成就;⚠️ 非直接依赖 `ISteamAchievement`,架构 16 §3
- [ ] `AnalyticsManager` + `IAnalyticsBackend`
- [ ] `CheatConsole`Debug 作弊命令)
- [ ] `AntiSoftlockSystem`(卡关检测 + 自动解锁)
- [ ] `SpeedrunTimer`IGT/RTA 计时)
#### P4-6编辑器工具09_EditorExtensions
- [ ] `AddressKeyValidator`完整版Build 前校验)
- [ ] `AddressReferenceGraphWindow``BaseGames/Tools/Asset Reference Graph`;扫描所有 `.cs``AddressKeys.X` 的引用,标红孤儿 key导出 CSV架构 13 §11
- [ ] `DestructibleTile`/`DirectionalDestructible`/`FalseWall`/`PhantomPlate` Gizmo 完整实现
- [ ] `NavSurface` 快速烘焙快捷键
- [ ] SO 事件频道 Inspector 实时测试按钮(`RaiseInEditor`
- [ ] `CharmEffectDrawer``CharmSO.effects` 自定义 PropertyDrawer架构 16 §4.1
- [ ] `SOValidationRunner` + `IValidatable` 接口(预构建 SO 数据验证;菜单 `Tools/Validate All SOs` + Build Pre-process架构 16 §10
- [ ] `EventBusMonitorWindow`Editor Only运行时事件监控面板显示订阅者数量架构 02 §9
- [ ] `EventChainEditorWindow``BaseGames/Tools/Event Chain Viewer`;事件链可视化 + 运行时状态着色 + 依赖箭头;架构 14 §13
- [ ] `BossSkillSequenceWindow``BaseGames/Tools/Boss Skill Sequence Viewer`SkillSequenceSO 甘特图时间轴可视化;架构 23 §12
---
## 8. 模块依赖顺序
```
BaseGames.Core.Events
└─► BaseGames.CoreGameManager、SceneLoader、ObjectPool
└─► BaseGames.Core.SaveSaveManager
└─► BaseGames.InputInputReaderSO
└─► BaseGames.CameraCameraStateController
└─► BaseGames.CombatDamageInfo、HitBox、HurtBox
└─► BaseGames.PlayerPlayerController + FSM
└─► BaseGames.EnemiesEnemyBase + AI
└─► BaseGames.WorldWorldInteractables、RoomTransition
└─► BaseGames.ProgressionAbilityGate、Charms、Quest
└─► BaseGames.UI全量 Panel
└─► BaseGames.AudioAudioMixer + AudioEventSO
└─► BaseGames.Dialogue/Cutscene
```
**原则**:低层模块不引用高层。`Core.Events` 是唯一无依赖模块,所有其他模块均可安全引用。
---
## 9. 技术风险与缓解策略
| 风险 | 严重度 | 缓解方案 |
|------|--------|---------|
| Animancer + Behavior Designer 冲突(双方均用 Update 驱动) | 🔴 高 | Phase 1 最先验证;`AnimancerComponent.Playable.Speed` 控制暂停,不与 BD 冲突 |
| PathBerserker2d NavSurface 烘焙在移动平台上失效 | 🟠 中 | Phase 1 验证 `LocalNavSurface`;失效则退化到手动 NavLink |
| Addressables 场景 Additive Load 内存泄漏 | 🟠 中 | `AssetReleaseTracker``SceneUnloaded` 回调中强制 ReleasePhase 1 末验证 |
| AudioEventSO 未完整填充导致 SFX 静音 | 🟡 低 | Phase 1 先用 `AudioManager.PlaySFX(AudioClip)` 直接传 ClipPhase 2 完成 `AudioEventSO` 后统一替换引用 |
| SO 事件频道大量 `.asset` 资产管理混乱 | 🟡 低 | `Assets/Data/Events/` 严格按模块子文件夹分组;命名规范 `EVT_{Module}_{Event}` |
| 钢铁之魂模式存档不可降级误操作 | 🟡 低 | `SaveData.Meta.IsSteelSoul` 写入后 `DifficultyManager` 锁死选项UI 二次确认 |