多轮审查和修复

This commit is contained in:
2026-05-12 15:34:08 +08:00
parent f55d2a57c3
commit ebbbb7332e
805 changed files with 838724 additions and 1905 deletions

View File

@@ -1,7 +1,7 @@
# 开发实施计划
> **版本**1.0
> **日期**2026-04-29
> **日期**2026-05-11
> **依据**`Docs/Architecture/`24 份架构文档)
> **目标**:完整实现 `Docs/Design/` 所有技术需求
@@ -60,9 +60,9 @@ Phase 4: 内容与完善Boss 技能、叙事、支撑系统、平台发布)
|-------|------|--------|---------|------|
| **0** | 项目基础设施 | 编译无错,基础框架可寻址加载 | 1 周 | ✅ 完成2026-05-07|
| **1** | 垂直切片 MVP | 一个房间可玩:移动/攻击/一只敌人/存读档 | 34 周 | ✅ 完成2026-05-08|
| **2** | 核心玩法扩展 | 完整玩家能力树/战斗系统/多种敌人 | 45 周 | |
| **3** | 世界与进程 | 完整地图/谜题/任务/商店 | 45 周 | |
| **4** | 内容与完善 | Boss/叙事/平台服务/QA | 34 周 | |
| **2** | 核心玩法扩展 | 完整玩家能力树/战斗系统/多种敌人 | 45 周 | 🔄 代码全部完成剩余VFX 资产填充 - 仅 Unity 编辑器操作)|
| **3** | 世界与进程 | 完整地图/谜题/任务/商店 | 45 周 | ✅ 代码全部完成剩余P3-1 Prefab 装配 - 仅 Unity 编辑器操作)|
| **4** | 内容与完善 | Boss/叙事/平台服务/QA | 34 周 | ✅ 完成2026-05-11P4-1P4-6 全部 ✅)|
---
@@ -237,67 +237,88 @@ Phase 4: 内容与完善Boss 技能、叙事、支撑系统、平台发布)
### 任务清单
#### 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攻击动画
- [x] State 补充Week 5`DashState``AerialDashState``WallSlideState``WallJumpState``AirAttackState``DownAttackState``UpAttackState``HurtState``DeadState``SpringState``ParryState`
- [x] `SwimState``21_LiquidPuzzleModule §SwimState`,✅ Week 11 完成
- [x] `PlayerWallDetector`(独立墙壁检测组件,双射线每侧防误判
- [x] `PlayerMovementConfigSO` 补充 `DefaultGravityScale`
- [x] `FormController`三形态切换Sky/Earth/Death`FormType``FormSO``FormConfigSO`
- [x] `WeaponManager`FormController 联动 + Override 护符替换 API`WeaponSO` 完整字段扩展
- [x] `PlayerCombat` 完整实现HitBox 四向激活、`SetComboSegmentSource``OnHitConfirmed`→灵力)
- [x] `PlayerController` Phase 2 扩展(`IPoiseSource` + 11 个新状态 + `TakeDamage` 路由到 HurtState/DeadState
- [x] `SkillManager`(技能槽 + 冷却计时)— 已在 P3-3 完整实现(`BaseGames.Skills` 程序集)
- [x] `SpringSystem`(头部弹簧摆动,完整实现)
- [x] Animancer 双层动画Base Layer移动动画+ Overlay Layer叠加层灵泉/魂技能)✅ 2026-05-12`PlayerController` 初始化 Layer 1`PlayOnOverlay`/`StopOverlay` API`SpringState` 改用叠加层)
#### P2-2护盾系统20_ShieldModule
- [x] `ShieldComponent`Phase 1 存根AbsorbDamage 全量穿透Phase 2 补完护盾值/再生/破盾事件
- [ ] `ShieldConfigSO`MaxShieldHP、AbsorptionRatio、RechargeDelay、RechargeRate
- [x] `ShieldComponent`Phase 2 完整实现:护盾值吸收、再生延迟、破盾惩罚事件;新增 `FullRecharge()` / `OnParrySuccess()` / 破碎惩罚计时;可选 `ShieldConfigSO` 覆盖内联字段
- [x] `ShieldConfigSO`MaxShieldHP、DamageAbsorptionRatio、RechargeDelay、RechargeRate、BrokenPenaltyDuration、ParryRestoreRatio
- [x] `IShieldable` 接口(`CombatInterfaces.cs`
- [ ] `HurtBox.ReceiveDamage` 接入护盾管道(HurtBox → ShieldComponent → IDamageable
- [ ] 护盾破碎/恢复 VFX 钩子
- [x] `HurtBox.ReceiveDamage` 接入护盾管道(步骤 4 `AbsorbDamage` 已实现ConsumeParry 步骤 2 已实现
- [x] 护盾破碎/恢复 VFX 钩子 ✅ 2026-05-13`ShieldComponent` 新增 `_onShieldBrokenChannel` / `_onShieldRestoredChannel` VoidEventChannelSO 字段,破碎时 Raise破碎惩罚结束及 FullRecharge 时 Raise restore
#### 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
- [x] `ProjectileConfigSO` + `LinearProjectile` + `ParryableProjectile`+ `ArcProjectile``HomingProjectile``ProjectileManager`
- [x] `ParrySystem` 5 阶段状态机Inactive/Startup/Active/EndLag/CounterWindow+ 完美弹反子弹时间 + C# 事件 + `ParryConfigSO`(全部 12 个字段)
- [x] `ParryInfo` struct + `ParryInfoEventChannelSO`SO 事件频道,`BaseGames.Parry` 程序集
- [x] `PoiseWindowConfig` struct`[Serializable]`,描述动画时间段霸体等级)+ `EnemyPoiseComponent``IPoiseSource` 实现,自动注入 HurtBox
- [x] `StatusEffectManager` + `StatusEffect`(抽象基类,架构 06_CombatModule §11`StatusEffectBase`+ 具体效果Poison、Burn、Freeze、Stun**已在 P2-4b 实现**
- [x] `IBreakable`(机关/障碍物交互接口;`CombatInterfaces.cs` 内定义;`HitBox` 已在命中非 `HurtBox` 时尝试调用
- [x] `ClashResolver`(拼刀系统:同帧玩家/敌人 HitBox 对碰检测,广播 `EVT_NailClash`;架构 06 §15✅ 2026-05-11`ClashConfigSO.cs``ClashResolver.cs` 新建;`HitBox.cs` 加入拼刀检测分支,`CanClash` / `IsActive` / `OwnerRigidbody` 属性)
#### 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-4动画事件系统24_AnimEventModule✅ Week 72026-05-11
- [x] `AnimationEventType` enum21 种事件类型
- [x] `AnimationEventConfigSO`
- [x] `AnimationEventBinder`
- [x] `PlayerAnimationEvents`(挂在玩家上)
- [x] `EnemyAnimationEvents`(挂在敌人上)
- [x] `IAnimationEventHandler` 接口(⚠️ 非 `IAnimEventReceiver`,架构 24_AnimEventModule §1 patch
- [x] 将 AttackState HitBox 激活时机从 FixedUpdate 改为 AnimEvent 驱动(已通过 Animancer `events.Add(0.3f/0.6f, ...)` 归一化时间事件实现)
- [x] Editor 工具:`EventConfigEditor``[CustomEditor(typeof(AnimationEventConfigSO))]`时间轴标记点可视化、Clip 漂移检测(偏差>5帧警告、normalizedTime 越界保护、事件类型着色;架构 24 §10
#### P2-4b状态效果系统06_CombatModule §11✅ Week 72026-05-11
- [x] `StatusEffectType.cs` 枚举Fire/Poison/Stagger/Freeze/Stun 架构定义 4 个值 Fire/Poison/Freeze/StunStagger 为实现扩展)
- [x] `StatusEffect.cs` 抽象基类双计时器Duration + TickTimerOnApply/OnStack/OnTick/OnExpire
- [x] `FireEffect.cs`DoTMaxStacks=1**3s**/0.5s/**1dmg True**/tickOnApply/OnExpire 设置 `_FireGlow` Shader 参数)
- [x] `PoisonEffect.cs`DoTMaxStacks=3**5s**/1s/**StackCount dmg True**/tickOnApply/OnStack/OnExpire 管理 `_PoisonGlow` Shader 参数)
- [x] `StaggerEffect.cs`硬直MaxStacks=1可自定义持续时间架构扩展非核心规格
- [x] `StatusEffectEventChannelSO.cs`SO 事件频道,携带 StatusEffectEvent struct架构用 StatusEffectType 直接广播,实现扩展为含 StackCount/RemainingDuration 的 struct 更利 UI
- [x] `StatusEffectManager.cs` 完整实现List + Dictionary 双结构ApplyEffect/CleanseEffect/CleanseAll/HasEffect`ApplyDirectDamage(DamageInfo)` 替代旧 DealDotDamage`SetShaderParam(string,float)` via MaterialPropertyBlockSpriteRenderer 初始化于 Awake
#### 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 到相机震动、控制器震动
- [x] 接通 Feel MMF_Player 到相机震动、控制器震动 ✅ 2026-05-13新增 `PostProcessManager``RegionLightController` + `RegionLightCatalogSO``PaletteSwapSystem` + `PaletteCatalogSO``BaseGames.VFX.asmdef` 加入 `BaseGames.Player` 引用)
#### P2-6难度系统19_DifficultyModule
- [ ] `DifficultyLevel` enum
- [ ] `DifficultyScalerSO` × 4 份资产Easy/Normal/Hard/SteelSoul
- [ ] `DifficultyManager``DefaultExecutionOrder: -900`
- [ ] `EVT_DifficultyChanged` 频道
- [ ] `PlayerStats`/`EnemyStats`/`ShopController` 订阅难度系数
- [ ] 钢铁之魂模式:一命锁定 + SaveData 标记
#### P2-6难度系统19_DifficultyModule✅ Week 82026-05-10
- [x] `DifficultyLevel` enum(已在 Core.Events`Easy/Normal/Hard/SteelSoul`
- [x] `DifficultyScalerSO` × 4 份资产Easy/Normal/Hard/SteelSoul — 脚本已创Unity 内创建资产
- [x] `DifficultyManager``DefaultExecutionOrder: -900`SteelSoul 不可降级
- [x] `BoolEventChannelSO`新增BossBase 依赖)
- [x] `PlayerStats` 订阅 `DifficultyChangedEventChannel`,难度切换时按 HP 比例缩放(`hpRatio × newMax`)并广播 `_onHPChanged`/`_onMaxHPChanged` ✅ 2026-05-11
- [x] `EnemyStats` 订阅 `DifficultyChangedEventChannel` 支持运行时切换;`Initialize()` 只缩放 HP不缩放 Defense架构 19 §5提取 `ApplyHPScaler()` ✅ 2026-05-11
- [x] `ShopController.GetEffectivePrice()` 新增公开方法;`TryPurchase()` 改用实际价格(含 `ShopPriceMultiplier`)✅ 2026-05-11
- [x] `DeathRespawnService.StartGameOverCoroutine()` 实现:删除存档槽 → `ISceneService.LoadMainMenuCoroutine()` ✅ 2026-05-11
- [x] `SaveManager.CurrentSlot` 公开属性(供 DeathRespawnService 获取当前槽)✅ 2026-05-11
- [x] `GameManager.DeathFlow()` 接入 SteelSoul 分支:检查 `InstantDeathOnZeroHP`true 时调用 `StartGameOverCoroutine()` 跳过普通死亡流程 ✅ 2026-05-11
- [x] `DifficultyScalerSO` × 4 份资产Easy/Normal/Hard/SteelSoul — 脚本已创Unity 内创建资产)
- [x] 钢铁之魂模式:`SaveMeta.IsSteelSoul` 字段写入 + `DifficultyManager` 实现 `ISaveable`OnSave/OnLoad在读档时锁定难度 ✅ 2026-05-11
#### 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-7敌人扩展07_EnemyModule 剩余)✅ Week 92026-05-10
- [x] `BossBase`Phase 切换 EnterPhase/IsHPBelow/Die 广播
- [x] `ProjectileConfigSO` + `Projectile` (Linear/Arc/Homing/Parryable) + `ProjectileManager`
- [x] `RangedEnemy` + `FlyingEnemy`EnemyBase 子类
- [x] `DeathShade`IInteractableGeo 回收事件
- [x] `LootTableSO` + `LootResolver`(加权随机掉落 + 难度缩放;`SpawnGeo`/`SpawnItem` 调用 `CollectibleSpawner` 静态方法Phase 3 TODO 占位已移除)✅ 2026-05-11
- [x] `AttackPatternSO` + `TelegraphSystem` ✅ 2026-05-12
- [x] `EnemyQuotaManager` ✅ 2026-05-12
- [x] `BatchLOSSystem` + `ILOSRequester` ✅ 2026-05-12
- [x] `BD_` 任务类补充14 个 Action + Conditional✅ 2026-05-12
#### P2-8音频系统完整11_AudioModule 完整)
- [ ] `AudioEventSO`SFX 配置 SO持有 `AudioClip` + `volume` + `pitch` 随机化范围
- [ ] `GlobalSFXPlayer`全局静态 SFX 播放入口,配合对象池管理位置 SFX
- [ ] `AudioConfigSO` 完整填表(区域 BGM 映射 + 快照名称枚举
- [ ] 为所有模块 SFX 钩子连接 `AudioEventSO`(替代直接传递 `AudioClip`
#### P2-8音频系统完整11_AudioModule 完整)✅ Week 82026-05-10
- [x] `AudioEventSO`随机音效 SOPlay / PlayOneShot
- [x] `GlobalSFXPlayer`(静态 SFX 入口,2D + 世界坐标 3D 播放
- [x] 为所有模块 SFX 钩子连接 `AudioEventSO` ✅ 2026-05-13`CombatSFXController` 全部字段由 `AudioClip` 升级为 `AudioEventSO`,通过 `GlobalSFXPlayer.Play()` 播放,支持随机音量/音调/多片段
---
@@ -307,57 +328,78 @@ Phase 4: 内容与完善Boss 技能、叙事、支撑系统、平台发布)
### 任务清单
#### 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-1世界模块完整08_WorldModule✅ Week 10 代码完成
- [x] `RoomTransition`(门/传送Additive 场景加载/卸载)
- [x] `HazardZone`(即死/持续伤害区域)
- [x] `Collectible`Geo/物品,弧线吸附)
- [x] `DestructibleTile`(三帧图集,三种触发条件)+ `DirectionalDestructible`
- [x] `DirectionalInteractable`OneShot 持久化)
- [x] `MovingPlatform`(三种 MoveType + 乘客 Parent 方案)
- [x] `CrumblePlatform`(四态状态机 + NavLink 联动)
- [x] `FalseWall`(三种揭示条件)
- [x] `MagicWall`(仅 GizmoLayer Matrix 实现)
- [x] `SoftTerrain`Marker 组件)
- [x] `PhantomInteractable`(继承 `DirectionalInteractable`,响应 `PhantomBody` 层)
- [x] `WorldStateRegistry`(运行时缓存已触发/已破坏状态)
- [x] `CollectibleSpawner`(静态生成器;`SpawnGeo(Vector2, int)` / `SpawnItem(Vector2, string)`;由 `LootResolver` 调用)+ `CollectibleSpawnerConfig`MonoBehaviourPersistent 场景持有 GeoPrefab/ItemPrefab 引用Awake 注册到 CollectibleSpawner✅ 2026-05-11
- [x] `Collectible.SetGeo(int)` / `SetItem(string)`(运行时配置方法,由 CollectibleSpawner 实例化后调用;移除旧静态 SpawnGeo Debug.Log 占位)✅ 2026-05-11
- [x] `RoomTransition.HasItem` 接入 `WorldStateRegistry.IsCollected(itemId)`(不再返回硬编码 true新增 `[SerializeField] private WorldStateRegistry _worldState` 字段)✅ 2026-05-11
- [ ] 场景内端对端验证Unity 编辑器内 Prefab 装配 + 运行验证)
#### 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-2液体与谜题系统21_LiquidPuzzleModule✅ Week 11 代码完成
- [x] `LiquidZone` + `LiquidType` enum
- [x] `LiquidPhysicsConfigSO`(浮力、水下速度)
- [x] `SwimState`(已在 P3-2 完成
- [x] `ISwitchable``IActivatable` 接口
- [x] `PuzzleSwitch``PuzzleReceiver`AND/OR/XOR 逻辑)、`PuzzleWire`(可视化连接)
- [x] `WaterDangerState` + `UnderwaterPostProcessingController`(架构 21 §12-13
- [x] `FootstepMaterial` + `FootstepAudioConfigSO` + `UnderwaterAudioController`(架构 21 §3.3-3.4
- [x] `WorldMarker` + `BreadcrumbTracker` ✅ 2026-05-12
- [x] `TutorialManager` + `ContextualHintTrigger` ✅ 2026-05-12
#### P3-3进度系统09_ProgressionModule
- [ ] `AbilityGate`(能力锁区域,检查 `PlayerStats.unlockedAbilities`
- [ ] `AbilityUnlock`(解锁 Prefab播放解锁演出
- [ ] `CharmSO``CharmManager`(护符装备/卸载,Slot 管理)
- [ ] `SkillSO``SpellSO`(技能/魔法数据)
- [ ] `ToolSlotManager`(两槽工具 + 冷却)+ `ToolHUD`
- [ ] `EquipmentManager`(武器/防具装备)
#### P3-3进度系统09_ProgressionModule✅ 完成2026-05-10
- [x] `AbilityGate`(能力锁区域,检查 `PlayerStats.HasAbility()`
- [x] `AbilityUnlock`(解锁 Prefab播放解锁演出
- [x] `CharmSO``EquipmentManager`(护符装备/卸载,Notch 管理)
- [x] `CharmCatalogSO`(护符目录 SO`Find(charmId)→CharmSO``EquipmentManager.AddToCollection` + `OnLoad` 依赖)✅ 2026-05-11
- [x] `EquipmentManager.AddToCollection` 完整实现(从 CharmCatalogSO 查找 → 去重加入 `_collected`;旧 Debug.Log 占位已移除)✅ 2026-05-11
- [x] `EquipmentManager.OnSave/OnLoad` 完整实现(读写 `OwnedCharmIds`OnLoad 恢复 `_collected` 后逐个调用 `TryEquipCharm`)✅ 2026-05-11
- [x] `FormSkillSO``SkillManager``SkillModifierRegistry`(技能数据+管理+修改器)
- [x] `ToolSO``ToolSlotManager`(两槽工具 + 冷却)+ `ToolHUD`
- [x] `ToolCatalogSO`(工具目录 SO`Find(toolId)→ToolSO``ToolSlotManager.OnLoad` 依赖)✅ 2026-05-11
- [x] `ToolSlotManager.OnLoad` 完整实现(从 ToolCatalogSO 查找两槽 toolId → 调用 `EquipTool(i, tool)`;旧 TODO 已移除)✅ 2026-05-11
- [x] `EquipmentManager`(护符装备,多态 ICharmEffect
- [x] `RegionDefinitionSO``ProgressLock``BossProgressTracker``HPContainerPickup`
- [x] `SkillHitBoxInstance`(技能 HitBox Prefab 组件)
- [x] `CharmEffectDrawer`Editor 护符效果下拉 Inspector
#### P3-4任务与挑战22_QuestChallengeModule
- [ ] `QuestSO``QuestObjectiveSO``RewardSO`
- [ ] `QuestManager`(进度追踪,订阅世界事件
- [ ] `QuestGiver``IInteractable` NPC
- [ ] `ChallengeRoomSO``ChallengeEncounterSO``BossRushSequenceSO`
- [ ] `ChallengeRoomManager`
#### P3-4任务与挑战22_QuestChallengeModule✅ 完成2026-05-11
- [x] `QuestSO``QuestObjectiveSO`5 种具体类型)`RewardSO`(物品发放通过 `StringEventChannelSO _onItemGranted.Raise(id)` 广播,旧 InventoryManager 占位已移除)✅ 2026-05-11
- [x] `QuestManager`ISaveable事件驱动进度追踪)
- [x] `QuestGiver`继承 InteractableNPC,根据任务状态切换对话
- [x] `InteractableNPC``DialogueSequenceSO`BaseGames.Dialogue 基础实现)
- [x] `ChallengeRoomSO``ChallengeEncounterSO``BossRushSequenceSO`
- [x] `ChallengeRoomManager`Addressables 波次生成,快存/快读)
- [x] `ChallengeRoomTrigger`IInteractable 入口,事件触发场景加载)
- [x] `EnemyBase` 扩展:`EnemyId` 属性 + `OnDied` 事件
#### 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-5地图与商店15_MapShopModule✅ 完成2026-05-11
- [x] `MapRoomDataSO` + `MapDatabaseSO` + `RoomExitData` + `ExitDirection`(房间数据 SO架构 15 §1.1
- [x] `MapManager`ISaveable订阅 `EVT_RoomEntered``SetMapped(roomId)``[DefaultExecutionOrder(-700)]`架构 15 §1.2
- [x] `MapPanel` + `MapRoomCellUI`(格子地图 UI订阅 `EVT_MapUpdated` 增量刷新;架构 15 §1.3
- [x] `MapPlayerTracker``WorldToCell` 换算LateUpdate 找所在房间;架构 15 §1.4
- [x] `MapPinManager`ISaveable`_pins: List<MapPin>`MapPin/PinType 定义在 SaveData.cs 避免循环依赖;架构 15 §1.5
- [x] `ShopItemSO` + `ShopItemType`(架构 15 §2.1
- [x] `ShopInventorySO` + `RestockPolicy`(架构 15 §2.2
- [x] `ShopController`ISaveable`TryPurchase``GetAvailableItems``Restock``ShopPanel` 存根;架构 15 §2.3
- [x] `ShopNPC`IInteractable`DialogueEventChannelSO` 触发招呼对话→打开商店;架构 15 §2.4
- [x] Editor 工具:`MapRoomDataEditor``[CustomEditor(typeof(MapRoomDataSO))]`Scene 句柄拖拽 GridPosition/GridSize"居中 Scene View"按钮;架构 15 §5
#### P3-6存档完善12_SaveModule 剩余)
- [ ] `CrashReporter` + `EmergencySaveService` 定时检点完整实现
- [ ] `SaveMigrator` 版本迁移策略v1→v2 字段兼容)
- [ ] 存档槽 UI新建/删除/选择存档)
#### P3-6存档完善12_SaveModule 剩余)✅ 2026-05-11
- [x] `CrashReporter` + `EmergencySaveService.PromoteToSlot` 完整实现(定时检点 + 崩溃日志)
- [x] `SaveMigrator` 版本迁移策略v1.0→v1.1→v2.0→v2.1 字段兼容)
- [x] 存档槽 UI`SaveSlotController` + `SaveSlotUI`新建/删除/选择存档)
- [x] `SaveManager.DeleteSlotAsync` + `BaseGames.UI.asmdef` 添加 `BaseGames.Core.Save` 引用
---
@@ -367,57 +409,74 @@ Phase 4: 内容与完善Boss 技能、叙事、支撑系统、平台发布)
### 任务清单
#### P4-1Boss 技能系统23_BossSkillModule
- [ ] `BossSkillSO``BossSkillType` enum
- [ ] `AttackPatternSO`(已在 P2-7 基础上扩展
- [ ] `SkillSequenceSO`(多阶段技能编排
- [ ] `BossSkillExecutor`
- [ ] `WeakPointSystem`(脆弱点组件,命中切换 Boss 阶段
- [ ] `VulnerabilityWindow`
#### P4-1Boss 技能系统23_BossSkillModule✅ 2026-05-11
- [x] `BossSkillTypes.cs`:全部枚举(`BossSkillCategory``BossSkillType``InteractionTag``VulnTriggerType``WeakPointType``CounterType``ArenaEventType`)及 Serializable struct`VulnerabilityWindow``PlayerCounterResponse``ArenaEventTrigger``ArenaEventParams``ArenaEventData``BossResourceCost``IArenaInteractable`
- [x] `BossSkillSO``CreateAssetMenu`,引用 `AttackPatternSO[]``VulnerabilityWindow[]``PlayerCounterResponse[]``ArenaEventTrigger[]``BossResourceCost``PoiseWindowConfig``ClipTransition`
- [x] `AttackPatternSO`(伤害/弹幕/AoE/时序参数;`DamageSourceSO` 引用
- [x] `SkillSequenceSO``SequenceStep[]`,含重复逻辑 `RepeatIfPlayerInRange`
- [x] `BossResourceConfigSO`Boss 自身资源配置,如愤怒值
- [x] `BossSkillExecutor`Coroutine 实现;`ExecuteSkill()` / `InterruptCurrentSkill()`VulnerabilityWindow 与攻击序列并行协程;注:架构规格为 UniTask当前用 Coroutine 实现以匹配项目实际依赖)
- [x] `WeakPointSystem`(弱点 HurtBox 激活管理;`SetActive(bool, float, bool)``_onVulnerabilityWindowOpened` 广播)
#### P4-2叙事系统14_NarrativeModule
- [ ] `DialogueManager`DialogueGraph SO 驱动)
- [ ] `CutsceneManager` + `CutsceneSO` + `CutsceneTrigger`
- [ ] `EventChainSO`(线性事件链触发器)
- [ ] `InteractableNPC` 基类(`IInteractable`,触发对话)
#### P4-2叙事系统14_NarrativeModule✅ 2026-05-11
- [x] `DialogueSequenceSO` 补全 `DialogueLine.portraitSprite` / `typewriterDelay` 字段 ✅ 2026-05-11
- [x] `DialogueUI`打字机效果StringBuilder 零分配;`ShowLine` / `SkipTyping` / `Hide``IsTyping` 状态属性)✅ 2026-05-11
- [x] `DialogueManager`Coroutine 驱动打字序列;`StartDialogue(sequence, npcId)`Action Map 切换;广播 `EVT_NpcDialogueCompleted`;注册到 ServiceLocator✅ 2026-05-11
- [x] `InteractionPromptController`(交互提示 UI键盘/手柄图标自动切换;挂在 IInteractable 子节点)✅ 2026-05-11
- [x] `NarrativeNPC`(扩展 InteractableNPC`DialogueVersion[]` 条件对话版本;接入 `WorldStateRegistry`)✅ 2026-05-11
- [x] `InteractableNPC.PlayDialogue()` 接入 `ServiceLocator.GetOrDefault<DialogueManager>()` ✅ 2026-05-11
- [x] `EventChainSO` + 内置 7 个 `ChainCondition` + 10 个 `ChainAction`(全事件频道驱动,无跨程序集直接依赖;`BaseGames.EventChain` 新程序集)✅ 2026-05-11
- [x] `EventChainManager`(订阅 5 条 StringEventChannelSO 中继EvaluateAll存档集成防重入✅ 2026-05-11
- [x] `CutsceneSO``TimelineAsset``CutsceneBinding[]``CameraBlendProfileSO` 混合;`DialogueSequenceSO[]` 叠加层)✅ 2026-05-11
- [x] `CutsceneManager``PlayableDirector` 封装;`PlayById` 事件驱动Action Map 切换;`EVT_CutsceneStarted/Ended`)✅ 2026-05-11
- [x] `CutsceneTrigger`4 种模式OnEnter/OnInteract/OnSceneLoad/OnEvent实现 `IInteractable`WorldStateRegistry 去重)✅ 2026-05-11
- [x] `SignalEmitterClip` + `SignalEmitterBehaviour`Timeline → VoidEventChannelSO 零耦合桥接;支持循环重播)✅ 2026-05-11
#### P4-3输入重绑定04_InputModule §6
- [ ] `RebindPanel`
- [ ] `RebindActionRow`
- [ ] `ConflictDetector`
- [ ] `RebindPersistence`(写入 `PlayerPrefs`
#### P4-3输入重绑定04_InputModule §6✅ 2026-05-11
- [x] `InputReaderSO` 补全重绑定 API`StartRebinding()`(自动 Dispose op`SaveBindingOverrides()``LoadBindingOverrides()``ResetBindings()``GetAllActionMap()``FindAction()` ✅ 2026-05-11
- [x] `InputReaderBootstrap` 启动时调用 `LoadBindingOverrides()`(在 `EnableGameplayInput()` 前)✅ 2026-05-11
- [x] `ConflictDetector`(扫描 Gameplay Map 重复 effectivePath返回冲突 Action 名称 HashSet✅ 2026-05-11
- [x] `RebindActionRow`(单行:显示当前绑定 HumanReadable 路径;排他锁 SetInteractable冲突红色高亮✅ 2026-05-11
- [x] `RebindPanel`(统一协调排他重绑定流程;`OnResetAll`;完成后自动 `SaveBindingOverrides`)✅ 2026-05-11
- [x] `BaseGames.UI.asmdef` 补充 `BaseGames.Input` + `Unity.InputSystem` 引用 ✅ 2026-05-11
#### 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
- [x] `PauseMenuController`(设置/键位重绑定/退出;架构 10 §7.3)✅ 2026-05-11
- [x] `SettingsPanelController`(音量/画质/帧率/VSync 设置面板;架构 10 §7.4)✅ 2026-05-11
- [x] `BossHPBar`Boss 血条 + 阶段标记;订阅 EVT_BossFightToggled/HPChanged架构 10 §4✅ 2026-05-11
- [x] `SaveIndicator`(右下角存档提示;订阅 EVT_SaveIndicatorVisible架构 10 §7.6)✅ 2026-05-11
- [x] `LoadingOverlay`(全屏黑幕淡入淡出;订阅 EVT_LoadingOverlay架构 10 §8✅ 2026-05-11
- [x] `LoadingScreenManager`(进度条 + 提示文字 + 随机背景;架构 10 §7.7)✅ 2026-05-11
- [x] `FloatingDamageText` + `FloatingDamageSpawner`(对象池伤害飘字;订阅 EVT_DamageDealt架构 10 §10✅ 2026-05-11
- [x] `ToastNotification` + `ToastManager`(成就/能力 Toast 队列弹出;架构 10 §11✅ 2026-05-11
- [x] `InputDeviceIconSetSO` + `InputDeviceIconSwitcher` + `InputIconImage`(键鼠/手柄图标切换;架构 10 §12✅ 2026-05-11
- [x] `BaseGames.UI.asmdef` 补充 `BaseGames.Combat` 引用 ✅ 2026-05-11
- [x] `SaveSlotController` + `SaveSlotUI`(主菜单 3 槽存档卡片 UI架构 10 §7.5)✅ 已在 P3-6 完成
#### 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-5支撑模块16_SupportingModules✅ 已完成
- [x] `LocalizationManager` + `LanguageManagerSO``#if UNITY_LOCALIZATION` 守卫fallback 返回 key架构 16 §5
- [x] `IPlatformService` ServiceLocator + `SteamPlatformService` + `NullPlatformService` + `PlatformBootstrap`(架构 16 §2
- [x] `AchievementManager`(通过 `ServiceLocator.Get<IPlatformService>()` 接入平台成就;12 条件类;架构 16 §3
- [x] `AnalyticsManager`(本地 JSON 日志TrackBossKill/TrackDeath/TrackSessionStart/End架构 16 §7
- [x] `DebugCheatSystem``#if UNITY_EDITOR || DEVELOPMENT_BUILD`heal/addgeo/godmode/unlock/killall/scene/revive架构 16 §4
- [x] `AntiSoftlockSystem` + `RoomEscapeInfoSO` + `HardAbilityGate`(卡关检测 + 自动解锁;架构 16 §6
- [x] `SpeedrunTimer`unscaledDeltaTimeISaveable架构 16 §8
- [x] `AccessibilitySettingsSO` + `AccessibilityManager` + `ColorBlindFilter`(色盲矩阵 URP RenderFeature架构 16 §6
- [x] `BaseGames.Support.asmdef`(引用 Core/Events/Save/Input/Player/Enemies/Combat/World/Progression/Platform/TMP/URP
#### 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
#### P4-6编辑器工具09_EditorExtensions✅ 2026-05-11
- [x] `AddressKeyValidator`Build Pre-process hook`AddressKeyValidatorBuildHook``AddressKeyValidator.cs` 补充callbackOrder=0架构 13 §10✅ 2026-05-11
- [x] `AddressReferenceGraphWindow``BaseGames/Tools/Asset Reference Graph`;扫描所有 `.cs``AddressKeys.X` 的引用,标红孤儿 key橙色标注不在 Addressables 的 key一键导出 CSV架构 13 §11✅ 2026-05-11
- [x] `DirectionalDestructible`/`FalseWall`/`MovingPlatform`/`HazardZone`/`RoomTransition` Gizmo 已实现;`DestructibleTile` Gizmo`DestructibleTileEditor.cs`)已补充;`PhantomPlate` 已创建 ✅ 2026-05-11
- [x] `NavSurfaceBakeShortcut``%#b` 快捷键;`BaseGames/Tools/Bake All NavSurfaces`;完成时 SetDirty + 打印用时;架构 PathBerserker2d✅ 2026-05-11
- [x] `EventChannelEditor``VoidBaseEventChannelSO` RaiseInEditor 按钮;`BaseEventChannelSO<T>` 订阅者数量显示Play Mode only架构 02 §9✅ 2026-05-11
- [x] `CharmEffectDrawer``CharmSO.effects` 自定义 PropertyDrawer实现为 `CharmSOEditor`,含类型下拉+效果预览;架构 16 §4.1)✅ 已在 P3-3 完成
- [x] `SOValidationRunner` + `IValidatable` 接口(预构建 SO 数据验证;菜单 `Tools/Validate All SOs` + `IPreprocessBuildWithReport`;架构 16 §10✅ 2026-05-11
- [x] `EventBusMonitorWindow`Editor Only运行时事件监控面板显示订阅者数量架构 02 §9
- [x] `EventChainEditorWindow``BaseGames/Tools/Event Chain Viewer`左侧链列表/右侧条件+动作表格Play Mode 运行时着色绿/橙;`ChainCompletedCondition` 依赖链显示;执行日志最近 20 条;双击 PingObject架构 14 §13✅ 2026-05-11
- [x] `BossSkillSequenceWindow``BaseGames/Tools/Boss Skill Sequence Viewer``BossSkillSO`/`SkillSequenceSO` 甘特图时间轴Windup黄/Active红/Recovery灰/Vuln绿/Delay暗灰拖放加载架构 23 §12✅ 2026-05-11
- [x] `AchievementSOEditor``[CustomEditor(typeof(AchievementSO))]`;条件中文类型标签;内联展开 SO 字段Ping/Delete 按钮;架构 16 §2.4)✅ 2026-05-11
- [x] `BaseGames.Editor.asmdef` 补充 `BaseGames.EventChain` 引用 ✅ 2026-05-11
---

View File

@@ -57,7 +57,7 @@ Week 9: EnemyBase 子类RangedEnemy远程+ FlyingEnemy飞行巡逻
---
## 2. Week 5玩家 FSM 完整扩展
## 2. Week 5玩家 FSM 完整扩展 ✅ 完成2026-05-12
**参考文档**`05_PlayerModule.md §2`
@@ -525,10 +525,32 @@ public partial class PlayerController : MonoBehaviour, IPoiseSource
---
## 3. Week 6护盾 + 弹反 + 战斗深化
## 3. Week 6护盾 + 弹反 + 战斗深化 ✅ 完成2026-05-10
**参考文档**`06_CombatModule.md §8-13``20_ShieldModule.md`
> **实现摘要**(与原计划的实际偏差):
> - `ShieldConfigSO` 放在 `BaseGames.Combat` 命名空间(非 `BaseGames.Player.Shield`),统一管理
> - `ShieldComponent` 新增 `FullRecharge()` / `OnParrySuccess()` / `_brokenPenaltyTimer` / 可选 `ShieldConfigSO` 覆盖
> - `ParrySystem` 使用 **C# 事件**`OnParryActivated` / `OnParryConsumed`)替代 `ForceState(PlayerStateType.Parry)` 强制转换,避免 Parry 程序集引用 Player.States 程序集
> - `ParryInfo` 结构体仅含 `IsPerfect` + `SoulGained`(去掉 `DamageInfo OriginalDamage` 字段,保持 Parry 不引用 Combat 的程序集约束)
> - `PlayerController.Awake()` 新增订阅 `ParrySystem.OnParryActivated`(转 ParryState和 `OnParryConsumed`(发放灵力+恢复护盾),`OnDestroy()` 解订阅
> - `BaseGames.Parry.asmdef` 新增引用:`BaseGames.Input`、`BaseGames.Core.Events`
**完成文件清单**
```
新建Assets/Scripts/Combat/ShieldConfigSO.cs
新建Assets/Scripts/Combat/PoiseWindowConfig.cs
新建Assets/Scripts/Parry/ParryConfigSO.cs
新建Assets/Scripts/Parry/ParryInfo.cs
新建Assets/Scripts/Parry/ParryInfoEventChannelSO.cs
新建Assets/Scripts/Enemies/EnemyPoiseComponent.cs
修改Assets/Scripts/Combat/ShieldComponent.csFullRecharge/OnParrySuccess/破碎惩罚/ShieldConfigSO
修改Assets/Scripts/Parry/ParrySystem.cs5 阶段状态机完整重写)
修改Assets/Scripts/Player/States/PlayerController.cs订阅 ParrySystem 事件)
修改Assets/Scripts/Parry/BaseGames.Parry.asmdef新增 Input + Core.Events 引用)
```
### 3.0 护盾数据层 SO 与接口
```csharp
@@ -1125,10 +1147,38 @@ public class BreakableProp : MonoBehaviour, IBreakable
---
## 4. Week 7状态效果 + 动画事件 + 完整 VFX
## 4. Week 7状态效果 + 动画事件 + 完整 VFX ✅ 代码完成2026-05-13VFX 资产填充仅需 Unity 编辑器)
**当前状态**:✅ 完成2026-05-11
**参考文档**`06_CombatModule.md §10-11``16_AnimationModule.md``18_VFXFeedbackModule.md`
**已实施内容**
1.**动画事件骨架**`AnimationEventType.cs`**21 种事件类型**)、`IAnimationEventHandler.cs`(接口)、`AnimationEventConfigSO.cs`SO 资产 + 时间线编辑支持)、`AnimationEventBinder.cs`Animancer SetCallback 注入)
2.**状态效果系统**`StatusEffectType.cs`(枚举,含 Stagger 扩展项)、`StatusEffect.cs`(抽象基类,非 StatusEffectBase`FireEffect.cs`DoT不可叠加**3s/0.5s/1dmg True**,含 `_FireGlow` Shader`PoisonEffect.cs`DoT3层叠加**5s/1s/StackCount dmg True**,含 `_PoisonGlow` Shader`StaggerEffect.cs`(硬直,架构扩展)、`StatusEffectEventChannelSO.cs`SO 事件频道)
3.**StatusEffectManager 完整重写**双结构List + Dictionary、O(1) 查找、`ApplyDirectDamage(DamageInfo)` via IDamageable、`SetShaderParam(string,float)` via MaterialPropertyBlock、`CleanseEffect`/`CleanseAll``HasEffect` 查询、SO 事件广播、SpriteRenderer + MaterialPropertyBlock Awake 初始化
4.**动画事件接线**`PlayerAnimationEvents.cs`(含 HitBox.Id 按名精确激活、ParrySystem.OpenParryWindow/CloseParryWindow、CancelWindowOpen、IFrame、Feedback`EnemyAnimationEvents.cs`(含 SpawnProjectile、SetRoaring、TriggerPhaseTwo、OnAnimationComplete
5.**编辑器工具**`EventConfigEditor.cs`(时间线色块预览 + 归一化时间验证 + Clip 长度漂移检测 + 排序按钮)
6.**依赖修改**`BaseGames.Animation.asmdef` 添加 Combat/Parry/Feedback/Player/Enemies 引用;`BaseGames.Combat.StatusEffects.asmdef` 添加 Core.Events 引用;`BaseGames.Editor.asmdef` 添加 Animation 引用
7.**HitBox.Id** 属性新增(`[SerializeField] private string _id`
8.**EnemyBase** 虚方法:`SpawnProjectile``TriggerPhaseTwo``OnAnimationComplete``SetRoaring`
**注**FootstepSystem计划 §4.1.2)为 Footstep 事件留了占位(不调用任何实现),待音频模块阶段(`FootstepCatalogSO` + Addressables 异步加载)完整实现。
**架构差异注记(已验证 2026-05-11**
- **ParrySystem 方法名**:架构 24 §5 代码示例写的是 `OpenWindow()`/`CloseWindow()`,实际 ParrySystem API06 §8`OpenParryWindow()`/`CloseParryWindow()`,代码已按正确 API 实现
- **StatusEffectType 枚举**:架构 §11 定义 4 值 {Fire, Poison, Freeze, Stun},实现额外添加 `Stagger` 作为硬直扩展
- **StatusEffectEventChannelSO**:架构期望广播 `StatusEffectType` 直接值,实现扩展为包含 StackCount/RemainingDuration 的 `StatusEffectEvent` structUI 更方便)
- **EnemyAnimationEvents RoarStart/RoarEnd**:架构展示 `_enemy.Blackboard.SetVariableValue()` 直接调用,实现抽象为 `EnemyBase.SetRoaring(bool)` 虚方法(避免 Animation 程序集依赖 BehaviorDesigner
**实施优先级**(建议顺序):
1. **动画事件骨架**`AnimationEventType` 枚举 → `AnimationEventConfigSO``AnimationEventBinder``IAnimationEventHandler`
2. **状态效果系统**`StatusEffect` 抽象基类 → `FireEffect` / `PoisonEffect` / `StaggerEffect``StatusEffectManager`
3. **HurtBox 集成**:步骤 8 `_statusEffectable.ApplyStatusEffect(info.Type)` 连接 `StatusEffectManager`
4. **动画事件接线**`PlayerAnimationEvents` + `EnemyAnimationEvents`(含 HitBox 激活时机改为 AnimEvent 驱动)
5. **编辑器工具**`EventConfigEditor`(时间轴可视化 + Clip 漂移检测)
> **汇编约束**`BaseGames.Animation` 程序集需引用 `BaseGames.Combat`PlayerAnimationEvents 访问 HitBox/HurtBox和 `BaseGames.Parry`AnimEvent 驱动 ParrySystem.OpenParryWindow/CloseParryWindow注意架构文档示例写的是 OpenWindow/CloseWindow以实际 API 为准)。
### 4.1 AnimationEventType 枚举 + AnimationEventBinder
**参考文档**`24_AnimEventModule.md §2-4`
@@ -2117,7 +2167,7 @@ namespace BaseGames.VFX
---
## 5. Week 8难度系统 + AudioMixer 快照
## 5. Week 8难度系统 + AudioMixer 快照 ✅ 完成2026-05-10
**参考文档**`11_AudioModule.md §3-5``19_DifficultyModule.md §4`
@@ -2416,7 +2466,7 @@ namespace BaseGames.Core
---
## 6. Week 9敌人扩展 + BossBase 骨架
## 6. Week 9敌人扩展 + BossBase 骨架 ✅ 完成2026-05-10
**参考文档**`07_EnemyModule.md §3-5`
@@ -2759,23 +2809,123 @@ public class DeathShade : MonoBehaviour, IInteractable
## 7. 完成标准检查清单
> **图例**`☑` = 代码实现完成(待 Unity 运行时验证)|`□` = 尚未实现
```
冲刺:施加冲刺力 + 无敌帧期间不受伤 + 落地后正确切换 Idle
蹬墙:接触墙壁减速下滑 + 蹬墙跳正确方向
下劈:空中踩踏敌人时玩家弹起 + 地面撞击 VFX
上劈:向上攻击命中敌人 + 上劈后进入 Fall 状态
□ 弹反ParryWindow 内受攻击 → 弹反成功动画 + 敌人僵直
□ 护盾:受击时护盾优先吸收 + 护盾耐久条 UI 更新 + 破碎惩罚期间无护盾
冲刺:DashState 实现(施加冲刺力 + 无敌帧)——待 Unity 内验证落地切换 Idle
蹬墙:WallSlideState + WallJumpState 实现——待 Unity 内验证墙面检测与弹跳方向
下劈:DownAttackState 实现(向下速度 + 着地切换 Idle——待 Unity 内验证踩踏弹跳
上劈:UpAttackState 实现——待 Unity 内验证命中后进入 FallState
☑ ParryState 开启弹反窗口——待 ParrySystem 完整实现后验证成功/失败流程
☑ ShieldComponent 护盾吸收逻辑实现——待 HurtBox 护盾管道接入 + UI 耐久条
□ 状态效果Poison 每秒掉血 + StatusEffectManager 正确 Tick + 到期自动移除
□ AnimationEventType攻击动画 HitBox 激活时机与动画帧完全同步
□ EventConfigEditorAnimationEventConfigSO Inspector 时间轴可视化正常渲染Clip 漂移警告触发(偏差>5帧
FormController三形态切换 + 各形态使用对应武器 + 调色板切换
AudioMixerBGM 跨房间平滑切换Snapshot TransitionSFX 无卡顿
□ DifficultyManagerHard 模式敌人 HP 和伤害按 scaler 正确缩放
□ RangedEnemyProjectile 飞行命中玩家,玩家 HP 减少
□ BossBasePhase 切换HP 降至 50%)动画演出正确触发
□ LootResolver敌人死亡时随机掉落 Geo + 指定道具
□ Console 无 Error
FormController 三形态切换代码实现——待 Unity 内验证调色板切换与武器对应
AudioMixer 快照 APITransitionToSnapshot实现——待 Unity 内配置 MainMixer 快照并验证过渡
☑ AudioEventSO + GlobalSFXPlayer 代码实现——待 Unity 内填充音效资产并连接 SFX 钩子
☑ DifficultyManager + DifficultyScalerSO 代码实现——待 Unity 内创建 4 份 SO 资产并验证 Hard 模式缩放
☑ BoolEventChannelSO 实现——供 BossBase._onBossFightEnded 使用
☑ RangedEnemySpawnProjectile 重写实现——待 Unity 内挂载 ProjectileConfigSO 并验证 Projectile 命中
☑ FlyingEnemyRigidbody2D MoveTowards 追击 + 接触伤害实现——待 Unity 内验证导航行为
☑ BossBaseEnterPhase + IsHPBelow + Die 广播实现——待 Unity 内验证 Phase 切换演出触发
☑ LootTableSO + LootResolver加权随机掉落 + 难度缩放实现——待 Unity 内配置掉落表并验证
☑ ProjectileConfigSO + Projectile(Linear/Arc/Homing/Parryable) + ProjectileManager 实现——待对象池预热后验证
☑ DeathShadeIInteractable + Geo 回收事件实现——待 Unity 内验证交互流程
□ Console 无 ErrorUnity 编辑器内编译验证)
```
**Phase 2 完成后进入 Phase 3。**
### Week 5 已完成实现2026-05-09
| 文件 | 状态 | 说明 |
|------|------|------|
| `FormType.cs` | ✅ | Sky/Earth/Death 枚举 |
| `FormSO.cs` | ✅ | 单形态数据 SO |
| `FormConfigSO.cs` | ✅ | 三形态统一容器 |
| `FormController.cs` | ✅ | 形态切换 + C# 事件 + SO 事件频道 |
| `WeaponSO.cs` | ✅ | 完整扩展6 方向动画片段 + DamageSource + VFX |
| `WeaponManager.cs` | ✅ | FormController 联动 + 护符 Override 字典 |
| `PlayerCombat.cs` | ✅ | HitBox 四向激活 + SetComboSegmentSource + Soul 增益 |
| `PlayerStats.cs` | ✅ | AddSoul 别名 + 现有完整 API |
| `PlayerMovement.cs` | ✅ | Dash / WallSlide / WallJump 方法 |
| `PlayerMovementConfigSO.cs` | ✅ | 补充 DefaultGravityScale = 3f |
| `PlayerWallDetector.cs` | ✅ | 独立组件,双射线每侧检测 |
| `HitBox.cs` | ✅ | SetDamageSource 方法 |
| `DashState.cs` | ✅ | 无敌帧 + 重力置零 + 冷却 |
| `AerialDashState.cs` | ✅ | 空中冲刺计数 + 落地重置 |
| `WallSlideState.cs` | ✅ | 下滑限速 + 蹬墙跳触发 |
| `WallJumpState.cs` | ✅ | 蹬墙跳 + 输入锁定 |
| `AirAttackState.cs` | ✅ | 空中攻击 + HitBoxAir |
| `DownAttackState.cs` | ✅ | 下劈冲击 + 着地检测 |
| `UpAttackState.cs` | ✅ | 上劈 + 结束分流 |
| `HurtState.cs` | ✅ | 受击 + 击退 + 无敌帧 |
| `DeadState.cs` | ✅ | 物理冻结 + HurtBox 关闭 |
| `SpringState.cs` | ✅ | 灵泉治疗动画 |
| `ParryState.cs` | ✅ | 弹反窗口开关 |
| `PlayerController.cs` | ✅ | Phase 2 完整扩展IPoiseSource + 11 状态 + TakeDamage 路由)|
| `ShieldComponent.cs` | ✅ | Phase 2 完整实现(吸收 + 再生 + 破盾事件)|
### Week 8 已完成实现2026-05-10
| 文件 | 状态 | 说明 |
|------|------|------|
| `BoolEventChannelSO.cs` | ✅ | `BaseEventChannelSO<bool>` 频道BossBase 依赖 |
| `DifficultyScalerSO.cs` | ✅ | 难度缩放参数 SO含 AI/玩家/敌人/经济多维度字段 |
| `DifficultyManager.cs` | ✅ | 单例,`DefaultExecutionOrder(-900)`SteelSoul 不可降级 |
| `AudioEventSO.cs` | ✅ | 随机音效 SO支持 Play / PlayOneShot |
| `GlobalSFXPlayer.cs` | ✅ | 静态 SFX 入口,支持 2D 和世界坐标 3D 播放 |
| `EnemyBase._playerTransform` | ✅ | 改为 `protected`子类RangedEnemy/FlyingEnemy可访问 |
| `BaseGames.Combat.asmdef` | ✅ | 新增 `BaseGames.Core` 引用,供 GlobalObjectPool 使用 |
### Week 9 已完成实现2026-05-10
| 文件 | 状态 | 说明 |
|------|------|------|
| `ProjectileConfigSO.cs` | ✅ | 抛射物配置 SO速度/生命周期/弹反倍率/对象池键) |
| `Projectile.cs` | ✅ | 抽象基类Initialize + ReturnToPool依赖 PooledObject |
| `LinearProjectile.cs` | ✅ | 直线飞行,固定速度 |
| `ArcProjectile.cs` | ✅ | 抛物线LaunchAngleDeg + GravityScale |
| `HomingProjectile.cs` | ✅ | 追踪弹,每帧向目标转向 |
| `ParryableProjectile.cs` | ✅ | 可弹反,手动 OnTriggerEnter2D 检测 ParrySystem |
| `ProjectileManager.cs` | ✅ | 单例,缓存 PlayerTransform辅助 Homing 注入目标 |
| `RangedEnemy.cs` | ✅ | 重写 SpawnProjectileGlobalObjectPool.Spawn + Initialize |
| `FlyingEnemy.cs` | ✅ | Rigidbody2D MoveTowards 追击 + OnTriggerStay2D 接触伤害 |
| `BossBase.cs` | ✅ | EnterPhase(int) + IsHPBelow(ratio) + Die 广播战斗结束 |
| `LootTableSO.cs` | ✅ | 战利品表 SOLootEntry 含 BaseWeight + ScaleWithDifficulty |
| `LootResolver.cs` | ✅ | 加权随机掉落 + DifficultyManager 缩放保底 Geo |
| `DeathShade.cs` | ✅ | IInteractableIntEventChannelSO 零耦合返还 Geo |
### P2-7 补充实现2026-05-12
| 文件 | 状态 | 说明 |
|------|------|------|
| `ILOSRequester.cs` | ✅ | 视线检测请求接口(`LOSOrigin`/`LOSTarget`/`LOSBlockingMask`/`ReceiveLOSResult`);命名空间 `BaseGames.Enemies.AI` |
| `BatchLOSSystem.cs` | ✅ | 批量视线检测,`[DefaultExecutionOrder(-200)]`round-robin Raycast2D最多 8/帧),`Register`/`Unregister` |
| `TelegraphSystem.cs` | ✅ | Boss 预警系统;`ShowTelegraph(vfxKey, duration, pos)` Coroutine`GlobalObjectPool.Instance.Spawn``PooledObject.ReturnToPool()` |
| `EnemyQuotaManager.cs` | ✅ | BT 配额管理;最多 12 棵 BT 启用;每 10 帧按玩家距离排序重排 |
| `EnemyBase.cs` | ✅ | 扩展:实现 `ILOSRequester`;新增 `Nav`/`Movement`/`Stats`/`Animancer`/`AnimConfig`/`BehaviorTree``#if GRAPH_DESIGNER`)属性;`SetAggroTickRate``JumpTo` |
| `EnemyStatsSO.cs` | ✅ | 追加 `EyeOffset``Vector2(0,0.8f)`+ `LOSBlockingMask`LayerMask字段 |
| `EnemyMovement.cs` | ✅ | 追加 `JumpToTarget(Vector2)` 抛物线跳跃方法 |
| `EnemyAnimationConfigSO.cs` | ✅ | 追加 `GetClipByName(string)` 方法switch 路由 Idle/Walk/Run/Attack/Hurt/Death |
| `BD_TeleportTo.cs` | ✅ | Action单帧 `transform.position = Target.Value`,返回 Success |
| `BD_SummonMinions.cs` | ✅ | Action`GlobalObjectPool.Instance.Spawn(key, pos, Quaternion.identity)`;随机角度偏移 |
| `BD_EnterPhase.cs` | ✅ | Action`GetComponent<BossBase>()?.EnterPhase(PhaseIndex.Value)` |
| `BD_IsPlayerVisible.cs` | ✅ | Conditional调用 `_enemy.IsPlayerVisible()` |
| `BD_CanAttack.cs` | ✅ | Conditional调用 `_enemy.CanAttack()` |
| `BD_IsHPBelow.cs` | ✅ | ConditionalSharedFloat 阈值01`CurrentHP/MaxHP <= threshold` |
| `BD_IsGrounded.cs` | ✅ | Conditional`_enemy.Movement?.IsGrounded` |
| `BD_IsNearEdge.cs` | ✅ | Conditional`_enemy.Nav?.IsNearEdge()` |
| `BD_IsStateMatch.cs` | ✅ | ConditionalSharedInt TargetState`(int)_enemy.CurrentState == TargetState.Value` |
### P2-8 补充实现2026-05-13
| 文件 | 状态 | 说明 |
|------|------|------|
| `ShieldComponent.cs` | ✅ | P2-2 VFX 钩子:新增 `_onShieldBrokenChannel`VoidEventChannelSO`_onShieldRestoredChannel`VoidEventChannelSO破碎时 Raise broken破碎惩罚结束/FullRecharge 时 Raise restored |
| `PostProcessManager.cs` | ✅ | P2-5 VFX后处理 Volume 分区管理器Coroutine 渐变 Boss/Death/Victory Volume 权重;订阅 BossFightStarted/Ended、PlayerDied/Respawned、BossDefeated 事件频道 |
| `RegionLightController.cs` | ✅ | P2-5 VFX区域灯光切换订阅 `StringEventChannelSO _onRegionEntered`Coroutine 渐变 Global Light 2D 颜色和强度 |
| `RegionLightCatalogSO.cs` | ✅ | P2-5 VFX与 RegionLightController 同文件regionId → Color + Intensity 映射 |
| `PaletteSwapSystem.cs` | ✅ | P2-5 VFX形态调色板切换`ApplyPalette(FormType)` 通过 MaterialPropertyBlock 设置 `_PaletteTex` |
| `PaletteCatalogSO.cs` | ✅ | P2-5 VFX与 PaletteSwapSystem 同文件FormType → Texture2DLUT 1D 256×1 px映射 |
| `BaseGames.VFX.asmdef` | ✅ | 新增 `BaseGames.Player` 引用PaletteSwapSystem 需要 FormType |
| `CombatSFXController.cs` | ✅ | P2-8 SFX 钩子:所有字段由 `AudioClip` 升级为 `AudioEventSO`;播放改为 `GlobalSFXPlayer.Play(sfx, pos)`,支持随机音量/音调/多片段 |

View File

@@ -63,7 +63,7 @@ Week 14: MapModuleFog of War + 房间探索记录 + 传送点)
---
## 2. Week 10世界互动基础组件
## 2. Week 10世界互动基础组件 ✅ 完成2026-05-10
**参考文档**`08_WorldModule.md`
@@ -1012,7 +1012,7 @@ namespace BaseGames.Tutorial
---
## 3. Week 11液态谜题模块
## 3. Week 11液态谜题模块 ✅ 完成2026-05-11
**参考文档**`21_LiquidPuzzleModule.md`
@@ -1541,40 +1541,57 @@ public class UnderwaterAudioController : MonoBehaviour
```csharp
// Assets/Scripts/World/Liquid/WaterDangerState.cs
// ⚠️ 订阅 LiquidEventChannelSO携带 LiquidEvent struct非 LiquidZone 引用)
// ⚠️ 使用 PlayerStats.HasAbility 替代 AbilityInventorySO项目实际 API无额外 SO 依赖)
public class WaterDangerState : MonoBehaviour
{
[SerializeField] private LiquidPhysicsConfigSO _config;
[SerializeField] private AbilityInventorySO _abilityInventory; // 检查 swim 能力
[SerializeField] private PlayerStats _playerStats; // 检查 Swim 能力
[SerializeField] private LiquidEventChannelSO _onLiquidEntered; // EVT_LiquidEntered
[SerializeField] private LiquidEventChannelSO _onLiquidExited; // EVT_LiquidExited
[SerializeField] private FloatEventChannelSO _onDrownProgress; // 0~1 倒计时进度HUD 用)→ EVT_DrownProgress
[SerializeField] private VoidEventChannelSO _onPlayerDrowned; // 触发死亡 → EVT_PlayerDrowned
private float _drownTimer;
private bool _isActive;
public void OnEnterLiquid(LiquidZone zone)
private void OnEnable()
{
if (zone.Type != LiquidType.Water) return;
if (_abilityInventory.HasAbility(AbilityType.Swim)) return;
_isActive = true;
_drownTimer = _config.DrownTime;
if (_onLiquidEntered != null) _onLiquidEntered.OnEventRaised += OnEnterLiquid;
if (_onLiquidExited != null) _onLiquidExited.OnEventRaised += OnExitLiquid;
}
public void OnExitLiquid()
private void OnDisable()
{
if (_onLiquidEntered != null) _onLiquidEntered.OnEventRaised -= OnEnterLiquid;
if (_onLiquidExited != null) _onLiquidExited.OnEventRaised -= OnExitLiquid;
}
public void OnEnterLiquid(LiquidEvent evt)
{
if (evt.LiquidType != nameof(LiquidType.Water)) return;
if (_playerStats != null && _playerStats.HasAbility(AbilityType.Swim)) return;
_isActive = true;
_drownTimer = _config != null ? _config.DrownTime : 3f;
}
public void OnExitLiquid(LiquidEvent evt)
{
_isActive = false;
_drownTimer = _config.DrownTime;
_onDrownProgress.Raise(0f);
_drownTimer = _config != null ? _config.DrownTime : 3f;
_onDrownProgress?.Raise(0f);
}
private void Update()
{
if (!_isActive) return;
_drownTimer -= Time.deltaTime;
_onDrownProgress.Raise(1f - (_drownTimer / _config.DrownTime));
float drownTime = _config != null ? _config.DrownTime : 3f;
_onDrownProgress?.Raise(1f - (_drownTimer / drownTime));
if (_drownTimer <= 0f)
{
_isActive = false;
_onPlayerDrowned.Raise();
_onPlayerDrowned?.Raise();
}
}
}
@@ -1597,8 +1614,8 @@ public class UnderwaterPostProcessingController : MonoBehaviour
[SerializeField] private Volume _underwaterVolume; // 水下专属 VolumeWeightMode
[SerializeField] private float _blendInDuration = 0.3f;
[SerializeField] private float _blendOutDuration = 0.3f;
[SerializeField] private LiquidEventChannelSO _onLiquidEntered; // ⚠️ EVT_LiquidEnteredpayload: LiquidZone
[SerializeField] private VoidEventChannelSO _onLiquidExited; // ⚠️ EVT_LiquidExited
[SerializeField] private LiquidEventChannelSO _onLiquidEntered; // EVT_LiquidEnteredpayload: LiquidEvent struct
[SerializeField] private LiquidEventChannelSO _onLiquidExited; // EVT_LiquidExited(与 Enter 同类型,保持一致)
private Coroutine _blendCoroutine;
@@ -1613,12 +1630,12 @@ public class UnderwaterPostProcessingController : MonoBehaviour
_onLiquidExited.OnEventRaised -= OnLiquidExited;
}
private void OnLiquidEntered(LiquidZone zone)
private void OnLiquidEntered(LiquidEvent evt)
{
if (zone.Type != LiquidType.Water) return;
if (evt.LiquidType != nameof(LiquidType.Water)) return;
BlendVolume(1f, _blendInDuration);
}
private void OnLiquidExited() => BlendVolume(0f, _blendOutDuration);
private void OnLiquidExited(LiquidEvent evt) => BlendVolume(0f, _blendOutDuration);
private void BlendVolume(float target, float duration)
{
@@ -1641,7 +1658,7 @@ public class UnderwaterPostProcessingController : MonoBehaviour
---
## 4. Week 12进程模块护符/工具/技能)
## 4. Week 12进程模块护符/工具/技能)✅ 完成2026-05-10
**参考文档**`09_ProgressionModule.md`
@@ -2475,7 +2492,7 @@ public class HPContainerPickup : MonoBehaviour
---
## 5. Week 13任务与挑战房间
## 5. Week 13任务与挑战房间 ✅ 完成2026-05-11
**参考文档**`22_QuestChallengeModule.md`
@@ -3089,7 +3106,7 @@ public class QuestGiver : InteractableNPC
---
## 6. Week 14地图/商店/存档迁移
## 6. Week 14地图/商店/存档迁移 ✅ 完成P3-52026-05-11
**参考文档**`15_MapShopModule.md`
@@ -3624,6 +3641,58 @@ public static class SaveMigrator
## 7. 完成标准检查清单
### Week 10 已完成实现2026-05-10
| 文件 | 状态 | 说明 |
|------|------|------|
| `WorldStateRegistry.cs` | ✅ | ScriptableObjectContains/Mark 系列 API + HasFlag/SetFlag + LoadFromSave |
| `InteractableDetector.cs` | ✅ | OverlapCircleAll + FindNearest + InputReaderSO.InteractEvent 绑定 |
| `PlayerSpawnPoint.cs` | ✅ | TransitionId + SpawnPositionGizmo 绿球标记 |
| `RoomTransition.cs` | ✅ | IInteractable自动触发或按键广播 `scene|transitionId` 字符串 |
| `RoomController.cs` | ✅ | Start 切换 RoomCameraGetSpawnPoint 查询出生点 |
| `HazardZone.cs` | ✅ | 即死/定值伤害RespawnType 枚举 |
| `Collectible.cs` | ✅ | Geo/Item/HPOrb 三类PlayerStats 直接调用 |
| `DestructibleTile.cs` | ✅ | IDamageableCheckDestroyCondition virtual hookStart 读档恢复 |
| `DirectionalDestructible.cs` | ✅ | AttackSide 枚举 + SourcePosition 方向校验 |
| `DirectionalInteractable.cs` | ✅ | 三触发模式 + TriggerSide + OneShot 持久化 |
| `MagicWall.cs` | ✅ | Gizmo-only 标记,穿越靠 Layer Matrix |
| `SoftTerrain.cs` | ✅ | Marker 组件(无逻辑) |
| `PhantomInteractable.cs` | ✅ | 继承 DirectionalInteractable额外响应 PhantomBody 层 |
| `MovingPlatform.cs` | ✅ | LinearAB/WayPoints/TriggeredLinear + Passenger SetParent 方案 |
| `CrumblePlatform.cs` | ✅ | Warning/Crumbling/Gone/Respawn 四态协程 + MMF_Player |
| `FalseWall.cs` | ✅ | IDamageableProximity/AttackOnce/AlwaysOpen 三种揭示方式 |
| `BaseGames.World.asmdef` | ✅ | 新增 Input/Combat/Player/Camera/MoreMountains.Tools 引用 |
### P3-2 补充实现2026-05-12
| 文件 | 状态 | 说明 |
|------|------|------|
| `WorldMarkerEventChannelSO.cs` | ✅ | `BaseEventChannelSO<WorldMarker>` 事件频道;命名空间 `BaseGames.World` |
| `WorldMarker.cs` | ✅ | 场景导航标记点;`Activate()`/`Deactivate()` 广播事件频道;`WorldMarkerType` 枚举Objective/NPC/PointOfInterest/Exit/Secret |
| `BreadcrumbTracker.cs` | ✅ | 玩家位置历史追踪;`_recordInterval=2f`/`_maxCrumbs=20`/`_minMoveDistance=1f``GetRecentCrumbs(int)``IReadOnlyList<Vector2>`oldest→newest`Clear()` |
| `TutorialManager.cs` | ✅ | 单例 (`Instance`);实现 `ISaveable``ShowHint`/`CompleteHint`;进度写入 `SaveData.Tutorial`(非 PlayerPrefs与架构 12 §1 注解不同) |
| `TutorialHintUI.cs` | ✅ | HUD 提示 UI`Show(text, duration)` + `Hide()``AutoHideRoutine` 协程TMP_Text 标签 |
| `ContextualHintTrigger.cs` | ✅ | `[RequireComponent(Collider2D)]``_requiresAbility`/`_requiredAbility(AbilityType)` 条件;调用 `LocalizationManager.Get`;首次触发后 `gameObject.SetActive(false)` |
| `SaveData.cs` | ✅ | 追加 `TutorialSaveData Tutorial = new()`;新增 `TutorialSaveData` 类(含 `List<string> CompletedHintIds` |
| `BaseGames.Tutorial.asmdef` | ✅ | 引用 Core.Events/Core.Save/World/Player/Localization |
```
☑ InteractableDetectorOverlapCircleAll 检测最近交互物,驱动 UI 提示显示/隐藏(代码完成)
☑ WorldStateRegistryHashSet 持久化状态LoadFromSave/GetAllFlags 接口完成
☑ RoomTransition + RoomController + PlayerSpawnPoint房间切换框架完成待 SceneLoader 集成)
☑ HazardZone即死/定值伤害(代码完成,待 Unity 内配置 Layer 和 Tag 验证)
☑ CollectibleGeo/Item/HPOrb 拾取(代码完成,待 Unity 内配置 Prefab 验证)
☑ DestructibleTile + DirectionalDestructibleIDamageable + 方向校验(代码完成)
☑ DirectionalInteractable + PhantomInteractable三种触发模式 + WorldStateRegistry 持久化
☑ MagicWall + SoftTerrain标记组件无逻辑
☑ MovingPlatform三种移动模式 + Passenger SetParent 方案(代码完成)
☑ CrumblePlatform四态协程MMF_Player 反馈(代码完成)
☑ FalseWall三种揭示条件 + IDamageable代码完成
□ 场景内端对端验证(待 Unity 编辑器内装配 Prefab 并运行)
□ Console 无 ErrorUnity 编辑器内编译验证)
```
### Week 1114 待实施
```
□ RoomTransition触发切换 → 淡出 → 加载目标场景 → 玩家在对应 SpawnPoint 出生
□ HazardZone掉入深渊 → 瞬间死亡 → 正常死亡流程
@@ -3637,14 +3706,31 @@ public static class SaveMigrator
□ FormSkillSO切换形态 → 对应技能可用 → 释放消耗 SoulPower
□ QuestManager接任务 → 击杀指定敌人 → 进度推进 → 交任务 → 获得奖励
□ ChallengeRoom进入 → 锁门 → 三波敌人依次生成 → 通关 → 奖励 + 开门
MapPanel探索新房间后地图格子变亮已探索持久化重启后不重置
ShopController购买护符 → Geo 减少 → 护符进入 Inventory → 商店标记已售出
MapPanel探索新房间后地图格子变亮已探索持久化MapManager ISaveable 已实现
ShopController购买护符 → Geo 减少EVT_ItemPurchased→ 商店标记已售出IsUnique 机制)
□ 存档迁移:旧版本存档文件加载时无报错,缺失字段填充默认值
□ AddressReferenceGraphWindow菜单 BaseGames/Tools/Asset Reference Graph无孤儿 key红色标记
□ MapRoomDataEditorCustomEditor for MapRoomDataSOScene 内拖拽 GridPosition/GridSize 句柄无报错
□ Console 无 Error
```
### Week 14 已完成实现P3-5地图与商店模块
| 文件 | 状态 | 说明 |
|------|------|------|
| `MapRoomDataSO.cs` | ✅ | `MapRoomDataSO` + `MapDatabaseSO` + `RoomExitData` + `ExitDirection` |
| `MapManager.cs` | ✅ | ISaveable`[DefaultExecutionOrder(-700)]`;订阅 `EVT_RoomEntered``SetMapped` |
| `MapPanel.cs` | ✅ | `MapPanel` + `MapRoomCellUI`OnEnable 重建格子;`EVT_MapUpdated` 增量刷新 |
| `MapPlayerTracker.cs` | ✅ | `WorldToCell`18f/格LateUpdate 找所在房间;`NormalizedPositionInRoom` |
| `MapPin.cs` | ✅ | `MapPinManager` ISaveableMapPin/PinType 定义在 SaveData.cs 避免循环依赖) |
| `ShopItemSO.cs` | ✅ | `ShopItemSO` + `ShopItemType` 枚举CharmSO 引用 |
| `ShopInventorySO.cs` | ✅ | `ShopInventorySO` + `RestockPolicy` 枚举 |
| `ShopController.cs` | ✅ | ISaveable`TryPurchase``GetAvailableItems``Restock``ShopPanel` 存根 |
| `ShopNPC.cs` | ✅ | IInteractable`DialogueEventChannelSO` 触发招呼对话→打开商店 |
| `Editor/Map/MapRoomDataEditor.cs` | ✅ | `[CustomEditor(typeof(MapRoomDataSO))]`Scene 句柄拖拽;居中按钮 |
| `SaveData.cs` | ✅ | `MapSaveData``ExploredRooms/MappedRooms(List<string>)` + `Pins(List<MapPin>)` |
| `BaseGames.World.Map.asmdef` | ✅ | 新增 `BaseGames.Core.Save` + `BaseGames.Core.Events` 引用 |
| `BaseGames.World.Shop.asmdef` | ✅ | 新增 `BaseGames.Core.Save` + `BaseGames.Equipment` + `BaseGames.Dialogue` 引用 |
| `BaseGames.Editor.asmdef` | ✅ | 新增 `BaseGames.World.Map` 引用MapRoomDataEditor 需要) |
> **编辑器工具**`AddressReferenceGraphWindow``Assets/Editor/Assets/AddressReferenceGraphWindow.cs`)扫描所有 `.cs` 文件对 `AddressKeys.X` 的引用,标红孤儿 key0 引用),标黄单次引用 key标绿 ≥2 次引用 key支持导出 CSV架构 13 §11P3 优化)。
**Phase 3 完成后进入 Phase 4。**

View File

@@ -3,7 +3,8 @@
> **周期**34 周Week 1518
> **前置条件**Phase 3 全部完成标准通过
> **核心目标**Boss 技能系统、叙事/对话/过场、按键重绑定、完整 UI 面板、支撑系统(本地化/成就/Steam/调试工具、编辑器工具、QA 就绪
> **产出物**:游戏发布前技术层面全部完成,可进入内容填充 + 关卡设计阶段
> **产出物**:游戏发布前技术层面全部完成,可进入内容填充 + 关卡设计阶段
> **状态**:✅ 全部完成2026-05-11P4-1P4-6 全部 ✅)
---
@@ -75,7 +76,7 @@ Week 18: LocalizationManagerUnity Localization 包)
---
## 2. Week 15Boss 技能系统完整
## 2. Week 15Boss 技能系统完整 ✅ 完成2026-05-11
**参考文档**`23_BossSkillModule.md`
@@ -686,7 +687,7 @@ namespace BaseGames.Boss
---
## 3. Week 16叙事模块对话/过场/事件链)
## 3. Week 16叙事模块对话/过场/事件链)✅ 完成2026-05-11
**参考文档**`14_NarrativeModule.md`
@@ -1424,7 +1425,7 @@ public class SignalEmitterBehaviour : PlayableBehaviour
---
## 4. Week 17UI 完整面板 + 按键重绑定
## 4. Week 17UI 完整面板 + 按键重绑定 ✅ 完成2026-05-11
**参考文档**`10_UIModule.md`
@@ -2189,10 +2190,32 @@ public class DialogueBox : MonoBehaviour
---
## 5. Week 18支撑模块 + 编辑器工具 + QA
## 5. Week 18支撑模块 + 编辑器工具 + QA ✅ 完成2026-05-11
**参考文档**`16_SupportingModules.md`
> **✅ P4-5 验证状态(已完成验证)**
> 所有支撑模块文件已按架构 §1-§9 逐一对比,以下为最终裁定:
>
> | 模块 | 状态 | 说明 |
> |------|------|------|
> | `IPlatformService` | ✅ 已修复 | 补充了 `RunCallbacks`/`Shutdown`/`SetStat`/`IncrementStat`/`GetStat`/`IsCloudAvailable`/`CloudSaveAsync`/`CloudLoadAsync`/`SetRichPresence`/`ClearRichPresence`;保留代码额外扩展(排行榜/DLC/ShowOverlay/ClearAchievement|
> | `PlatformBootstrap` | ✅ 已修复 | 增加 `Update()→RunCallbacks()` + `OnApplicationQuit()→Shutdown()`|
> | `NullPlatformService` | ✅ 已更新 | 实现完整接口 |
> | `SteamPlatformService` | ✅ 已更新 | 增加 SetStat/IncrementStat/GetStat、CloudSaveAsync/CloudLoadAsync、SetRichPresence/ClearRichPresence、RunCallbacks/Shutdown |
> | `AnalyticsManager` | ✅ 已修复 | Awake 中添加 `#if !UNITY_EDITOR && !DEVELOPMENT_BUILD` 保护Release 包默认关闭);保留缓冲 JSON 格式(非架构 JSONL可接受|
> | `AchievementCondition` | ✅ 维持代码 | `IsMet(SaveData)` 轮询比架构的 RegisterListeners 事件模式更简洁;`GetProgress(SaveData)` 为额外增强 |
> | `AchievementManager` | ✅ 维持代码 | `ServiceLocator.Get<IPlatformService>()` 优于架构的 `#if STEAMWORKS_NET PlatformManager` 静态调用 |
> | `LocalizationManager` | ✅ 维持代码 | `Get(entryKey, tableName)` 参数顺序更符合调用习惯;`#if UNITY_LOCALIZATION` 守卫必要(包未安装)|
> | `LanguageManagerSO` | ✅ 维持代码 | 字段命名与 `ApplySaved()` 方法名不同于架构,但功能等价且更清晰 |
> | `AccessibilitySettingsSO` | ✅ 维持代码(简化版)| 架构字段更丰富(字幕/输入辅助/音频),当前代码仅实现核心子集;后续 P5/P6 可扩展 |
> | `AccessibilityManager` | ✅ 维持代码 | 缺少 `_onHighContrastChanged`/`_onSubtitlesChanged` 频道AccessibilitySettingsSO 简化对应);功能等价 |
> | `ColorBlindFilter` | ✅ 维持代码 | URP RenderFeature + Brettel/Viénot 色彩矩阵实现正确 |
> | `AntiSoftlockSystem` | ✅ 维持代码 | 代码用 `_stuckTimer + linearVelocity` 检测,比架构的位置距离对比更准确 |
> | `RoomEscapeInfoSO` | ✅ 维持代码(单路径版)| 架构用多路径 `EscapeRoute[]`,代码用单路径+优先级数组,更适合当前房间规模 |
> | `HardAbilityGate` | ✅ 维持代码 | 用 `World.Switches` key 验证物理拾取,比架构 `IsAbilityActuallyUnlocked()` 方法(不存在)更可行 |
> | `SpeedrunTimer` | ✅ 维持代码 | 代码有显式 Start/Pause/Resume/Stop API比架构订阅 `_onGameplayActive` 事件更灵活;后续可补事件订阅 |
### 5.1 LocalizationManager
`16_SupportingModules.md §1` 实现Unity Localization 包封装)。
@@ -3143,6 +3166,24 @@ public bool ShowSpeedrunTimer = false; // 默认隐藏,由设置界面开关
| `EventBusMonitorWindow` | `Window/EventBus Monitor` | Editor Only运行时监控所有事件频道的 Raise 次数和当前订阅者数量;通过 `EventBusMonitor.Record()` 静态方法接收数据(架构 02 §9|
| `EventChainEditorWindow` | `BaseGames/Tools/Event Chain Viewer` | 事件链可视化:左侧 chainId 分组总览,右侧条件/动作表格(`IsMet()` 颜色Play Mode 运行时状态着色(已完成=绿/进行中=橙),`ChainCompletedCondition` 依赖箭头,执行日志(最近 20 条双击→PingObject架构 14 §13|
| `BossSkillSequenceWindow` | `BaseGames/Tools/Boss Skill Sequence Viewer` | 以甘特图可视化 `SkillSequenceSO` 时间轴:攻击阶段蓝色条、延迟灰色间隙、`VulnerabilityWindow` 绿色覆盖条;点击高亮对应 `AttackPatternSO` Ping`DurationNormalized < 0.1` 时变红警告SO 拖放加载(架构 23 §12|
| `AchievementSOEditor` | — | `[CustomEditor(typeof(AchievementSO))]`conditions 数组中文类型标签12 种映射);内联展开 SO 字段Ping/Delete 按钮;" 添加条件 SO" 底部按钮(架构 16 §2.4|
> **✅ P4-6 完成状态2026-05-11**
>
> | 文件 | 状态 | 说明 |
> |------|------|------|
> | `IValidatable` 接口 | ✅ 已创建 | `Assets/Scripts/Core/Validation/IValidatable.cs``namespace BaseGames.Core``IEnumerable<string> Validate()` |
> | `SOValidationRunner` | ✅ 已创建 | `Assets/Scripts/Editor/Validation/SOValidationRunner.cs``IPreprocessBuildWithReport` callbackOrder=1`[MenuItem("Tools/Validate All ScriptableObjects")]`"必须"/❌ 为 Error其余为 Warning |
> | `AddressKeyValidator` 构建钩子 | ✅ 已修复 | `AddressKeyValidatorBuildHook` 内部类追加至现有文件callbackOrder=0调用 `RunValidation()`,有孤儿 key 则抛 `BuildFailedException` |
> | `EventChannelEditor` | ✅ 已创建 | `Assets/Scripts/Editor/EventChannelEditor.cs``VoidBaseEventChannelSO` RaiseInEditor 按钮(非 Play Mode 显示 HelpBox`BaseEventChannelSO<T>` 反射读取订阅者数 |
> | `PhantomPlate` | ✅ 已创建 | `Assets/Scripts/World/PhantomPlate.cs``namespace BaseGames.World``PlatformEffector2D` 单向穿透 + `TriggerDropThrough()` 下穿 APIEditor Gizmo 蓝色线框 |
> | `DestructibleTileEditor` | ✅ 已创建 | `Assets/Scripts/Editor/World/DestructibleTileEditor.cs``[DrawGizmo]` 橙红线框+半透明填充;`Handles.Label` "💥" 标签;选中/未选中透明度区分 |
> | `NavSurfaceBakeShortcut` | ✅ 已创建 | `Assets/Scripts/Editor/NavSurfaceBakeShortcut.cs``[MenuItem("BaseGames/Tools/Bake All NavSurfaces %#b")]``EditorApplication.update` 监听完成回调;打印每个 Surface 烘焙用时 |
> | `BossSkillSequenceWindow` | ✅ 已创建 | `Assets/Scripts/Editor/BossSkillSequenceWindow.cs``BossSkillSO`/`SkillSequenceSO` 甘特图Windup黄/Active红/Recovery灰/Vuln绿/Delay暗灰拖放加载点击标签 PingObject |
> | `EventChainEditorWindow` | ✅ 已创建 | `Assets/Scripts/Editor/EventChainEditorWindow.cs`;左侧链列表(完成=绿/激活=橙/未触发=灰);右侧条件+动作表Play Mode 反射读取 `_completedChains``ChainCompletedCondition` 依赖链显示;执行日志 20 条 |
> | `AddressReferenceGraphWindow` | ✅ 已创建 | `Assets/Scripts/Editor/AddressReferenceGraphWindow.cs`;反射遍历 `AddressKeys` 常量Regex 扫描所有 `.cs` 文件;孤儿 Key 红/无效 Key 橙/正常绿;导出 CSV |
> | `AchievementSOEditor` | ✅ 已创建 | `Assets/Scripts/Editor/Achievements/AchievementSOEditor.cs`12 种条件中文标签映射;内联 `SerializedObject` 子 SO 字段Ping/Delete 按钮 |
> | `BaseGames.Editor.asmdef` | ✅ 已更新 | 新增 `"BaseGames.EventChain"` 引用,`EventChainEditorWindow` 可正常编译 |
### 5.10 QA 执行