chore: initial commit
This commit is contained in:
455
Docs/Plan/00_DevelopmentPlan.md
Normal file
455
Docs/Plan/00_DevelopmentPlan.md
Normal 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 | 一个房间可玩:移动/攻击/一只敌人/存读档 | 3–4 周 | ✅ 完成(2026-05-08)|
|
||||
| **2** | 核心玩法扩展 | 完整玩家能力树/战斗系统/多种敌人 | 4–5 周 | — |
|
||||
| **3** | 世界与进程 | 完整地图/谜题/任务/商店 | 4–5 周 | — |
|
||||
| **4** | 内容与完善 | Boss/叙事/平台服务/QA | 3–4 周 | — |
|
||||
|
||||
---
|
||||
|
||||
## 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-2:SO 事件系统(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-3:Core 骨架(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 -2000,DontDestroyOnLoad;`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:最简 UI(10_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-9:VFX 最简(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:玩家完整 FSM(05_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` enum(20+ 事件)
|
||||
- [ ] `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` 接口(完整 API:PlayHit/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`(仅 Gizmo,Layer 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 §5,P3 优化)
|
||||
|
||||
#### P3-6:存档完善(12_SaveModule 剩余)
|
||||
- [ ] `CrashReporter` + `EmergencySaveService` 定时检点完整实现
|
||||
- [ ] `SaveMigrator` 版本迁移策略(v1→v2 字段兼容)
|
||||
- [ ] 存档槽 UI(新建/删除/选择存档)
|
||||
|
||||
---
|
||||
|
||||
## 7. Phase 4:内容与完善
|
||||
|
||||
**目标**:Boss 战系统、叙事/过场、平台服务层、本地化、Debug 工具,进入 QA 可测试状态。
|
||||
|
||||
### 任务清单
|
||||
|
||||
#### P4-1:Boss 技能系统(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-4:UI 完整(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.Core(GameManager、SceneLoader、ObjectPool)
|
||||
└─► BaseGames.Core.Save(SaveManager)
|
||||
└─► BaseGames.Input(InputReaderSO)
|
||||
└─► BaseGames.Camera(CameraStateController)
|
||||
└─► BaseGames.Combat(DamageInfo、HitBox、HurtBox)
|
||||
└─► BaseGames.Player(PlayerController + FSM)
|
||||
└─► BaseGames.Enemies(EnemyBase + AI)
|
||||
└─► BaseGames.World(WorldInteractables、RoomTransition)
|
||||
└─► BaseGames.Progression(AbilityGate、Charms、Quest)
|
||||
└─► BaseGames.UI(全量 Panel)
|
||||
└─► BaseGames.Audio(AudioMixer + 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` 回调中强制 Release;Phase 1 末验证 |
|
||||
| AudioEventSO 未完整填充导致 SFX 静音 | 🟡 低 | Phase 1 先用 `AudioManager.PlaySFX(AudioClip)` 直接传 Clip,Phase 2 完成 `AudioEventSO` 后统一替换引用 |
|
||||
| SO 事件频道大量 `.asset` 资产管理混乱 | 🟡 低 | `Assets/Data/Events/` 严格按模块子文件夹分组;命名规范 `EVT_{Module}_{Event}` |
|
||||
| 钢铁之魂模式存档不可降级误操作 | 🟡 低 | `SaveData.Meta.IsSteelSoul` 写入后 `DifficultyManager` 锁死选项,UI 二次确认 |
|
||||
Reference in New Issue
Block a user