chore: initial commit

This commit is contained in:
2026-05-08 11:04:00 +08:00
commit f55d2a57c3
6278 changed files with 866081 additions and 0 deletions

View File

@@ -0,0 +1,455 @@
# 开发实施计划
> **版本**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 二次确认 |