多轮审查和修复
This commit is contained in:
@@ -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 | 一个房间可玩:移动/攻击/一只敌人/存读档 | 3–4 周 | ✅ 完成(2026-05-08)|
|
||||
| **2** | 核心玩法扩展 | 完整玩家能力树/战斗系统/多种敌人 | 4–5 周 | — |
|
||||
| **3** | 世界与进程 | 完整地图/谜题/任务/商店 | 4–5 周 | — |
|
||||
| **4** | 内容与完善 | Boss/叙事/平台服务/QA | 3–4 周 | — |
|
||||
| **2** | 核心玩法扩展 | 完整玩家能力树/战斗系统/多种敌人 | 4–5 周 | 🔄 代码全部完成(剩余:VFX 资产填充 - 仅 Unity 编辑器操作)|
|
||||
| **3** | 世界与进程 | 完整地图/谜题/任务/商店 | 4–5 周 | ✅ 代码全部完成(剩余:P3-1 Prefab 装配 - 仅 Unity 编辑器操作)|
|
||||
| **4** | 内容与完善 | Boss/叙事/平台服务/QA | 3–4 周 | ✅ 完成(2026-05-11,P4-1~P4-6 全部 ✅)|
|
||||
|
||||
---
|
||||
|
||||
@@ -237,67 +237,88 @@ Phase 4: 内容与完善(Boss 技能、叙事、支撑系统、平台发布)
|
||||
### 任务清单
|
||||
|
||||
#### 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(攻击动画)
|
||||
- [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` 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-4:动画事件系统(24_AnimEventModule)✅ Week 7(2026-05-11)
|
||||
- [x] `AnimationEventType` enum(21 种事件类型)
|
||||
- [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 7(2026-05-11)
|
||||
- [x] `StatusEffectType.cs` 枚举(Fire/Poison/Stagger/Freeze/Stun;⚠️ 架构定义 4 个值 Fire/Poison/Freeze/Stun,Stagger 为实现扩展)
|
||||
- [x] `StatusEffect.cs` 抽象基类(双计时器:Duration + TickTimer;OnApply/OnStack/OnTick/OnExpire)
|
||||
- [x] `FireEffect.cs`(DoT,MaxStacks=1,**3s**/0.5s/**1dmg True**/tick;OnApply/OnExpire 设置 `_FireGlow` Shader 参数)
|
||||
- [x] `PoisonEffect.cs`(DoT,MaxStacks=3,**5s**/1s/**StackCount dmg True**/tick;OnApply/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 MaterialPropertyBlock;SpriteRenderer 初始化于 Awake)
|
||||
|
||||
#### 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 到相机震动、控制器震动
|
||||
- [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 8(2026-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 9(2026-05-10)
|
||||
- [x] `BossBase`(Phase 切换 EnterPhase/IsHPBelow/Die 广播)
|
||||
- [x] `ProjectileConfigSO` + `Projectile` (Linear/Arc/Homing/Parryable) + `ProjectileManager`
|
||||
- [x] `RangedEnemy` + `FlyingEnemy`(EnemyBase 子类)
|
||||
- [x] `DeathShade`(IInteractable,Geo 回收事件)
|
||||
- [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 8(2026-05-10)
|
||||
- [x] `AudioEventSO`(随机音效 SO,Play / 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`(仅 Gizmo,Layer 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`(仅 Gizmo,Layer Matrix 实现)
|
||||
- [x] `SoftTerrain`(Marker 组件)
|
||||
- [x] `PhantomInteractable`(继承 `DirectionalInteractable`,响应 `PhantomBody` 层)
|
||||
- [x] `WorldStateRegistry`(运行时缓存已触发/已破坏状态)
|
||||
- [x] `CollectibleSpawner`(静态生成器;`SpawnGeo(Vector2, int)` / `SpawnItem(Vector2, string)`;由 `LootResolver` 调用)+ `CollectibleSpawnerConfig`(MonoBehaviour,Persistent 场景持有 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 §5,P3 优化)
|
||||
#### 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-1:Boss 技能系统(23_BossSkillModule)
|
||||
- [ ] `BossSkillSO`、`BossSkillType` enum
|
||||
- [ ] `AttackPatternSO`(已在 P2-7 基础上扩展)
|
||||
- [ ] `SkillSequenceSO`(多阶段技能编排)
|
||||
- [ ] `BossSkillExecutor`
|
||||
- [ ] `WeakPointSystem`(脆弱点组件,命中切换 Boss 阶段)
|
||||
- [ ] `VulnerabilityWindow`
|
||||
#### P4-1:Boss 技能系统(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-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)
|
||||
- [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`(unscaledDeltaTime;ISaveable;架构 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
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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.cs(FullRecharge/OnParrySuccess/破碎惩罚/ShieldConfigSO)
|
||||
修改:Assets/Scripts/Parry/ParrySystem.cs(5 阶段状态机完整重写)
|
||||
修改: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-13,VFX 资产填充仅需 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`(DoT,3层叠加,**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 API(06 §8)为 `OpenParryWindow()`/`CloseParryWindow()`,代码已按正确 API 实现
|
||||
- **StatusEffectType 枚举**:架构 §11 定义 4 值 {Fire, Poison, Freeze, Stun},实现额外添加 `Stagger` 作为硬直扩展
|
||||
- **StatusEffectEventChannelSO**:架构期望广播 `StatusEffectType` 直接值,实现扩展为包含 StackCount/RemainingDuration 的 `StatusEffectEvent` struct(UI 更方便)
|
||||
- **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 激活时机与动画帧完全同步
|
||||
□ EventConfigEditor:AnimationEventConfigSO Inspector 时间轴可视化正常渲染,Clip 漂移警告触发(偏差>5帧)
|
||||
□ FormController:三形态切换 + 各形态使用对应武器 + 调色板切换
|
||||
□ AudioMixer:BGM 跨房间平滑切换(Snapshot Transition),SFX 无卡顿
|
||||
□ DifficultyManager:Hard 模式敌人 HP 和伤害按 scaler 正确缩放
|
||||
□ RangedEnemy:Projectile 飞行命中玩家,玩家 HP 减少
|
||||
□ BossBase:Phase 切换(HP 降至 50%)动画演出正确触发
|
||||
□ LootResolver:敌人死亡时随机掉落 Geo + 指定道具
|
||||
□ Console 无 Error
|
||||
☑ FormController 三形态切换代码实现——待 Unity 内验证调色板切换与武器对应
|
||||
☑ AudioMixer 快照 API(TransitionToSnapshot)实现——待 Unity 内配置 MainMixer 快照并验证过渡
|
||||
☑ AudioEventSO + GlobalSFXPlayer 代码实现——待 Unity 内填充音效资产并连接 SFX 钩子
|
||||
☑ DifficultyManager + DifficultyScalerSO 代码实现——待 Unity 内创建 4 份 SO 资产并验证 Hard 模式缩放
|
||||
☑ BoolEventChannelSO 实现——供 BossBase._onBossFightEnded 使用
|
||||
☑ RangedEnemy:SpawnProjectile 重写实现——待 Unity 内挂载 ProjectileConfigSO 并验证 Projectile 命中
|
||||
☑ FlyingEnemy:Rigidbody2D MoveTowards 追击 + 接触伤害实现——待 Unity 内验证导航行为
|
||||
☑ BossBase:EnterPhase + IsHPBelow + Die 广播实现——待 Unity 内验证 Phase 切换演出触发
|
||||
☑ LootTableSO + LootResolver:加权随机掉落 + 难度缩放实现——待 Unity 内配置掉落表并验证
|
||||
☑ ProjectileConfigSO + Projectile(Linear/Arc/Homing/Parryable) + ProjectileManager 实现——待对象池预热后验证
|
||||
☑ DeathShade:IInteractable + Geo 回收事件实现——待 Unity 内验证交互流程
|
||||
□ Console 无 Error(Unity 编辑器内编译验证)
|
||||
```
|
||||
|
||||
**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` | ✅ | 重写 SpawnProjectile,GlobalObjectPool.Spawn + Initialize |
|
||||
| `FlyingEnemy.cs` | ✅ | Rigidbody2D MoveTowards 追击 + OnTriggerStay2D 接触伤害 |
|
||||
| `BossBase.cs` | ✅ | EnterPhase(int) + IsHPBelow(ratio) + Die 广播战斗结束 |
|
||||
| `LootTableSO.cs` | ✅ | 战利品表 SO,LootEntry 含 BaseWeight + ScaleWithDifficulty |
|
||||
| `LootResolver.cs` | ✅ | 加权随机掉落 + DifficultyManager 缩放保底 Geo |
|
||||
| `DeathShade.cs` | ✅ | IInteractable,IntEventChannelSO 零耦合返还 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` | ✅ | Conditional;SharedFloat 阈值(0–1);`CurrentHP/MaxHP <= threshold` |
|
||||
| `BD_IsGrounded.cs` | ✅ | Conditional;`_enemy.Movement?.IsGrounded` |
|
||||
| `BD_IsNearEdge.cs` | ✅ | Conditional;`_enemy.Nav?.IsNearEdge()` |
|
||||
| `BD_IsStateMatch.cs` | ✅ | Conditional;SharedInt 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 → Texture2D(LUT 1D 256×1 px)映射 |
|
||||
| `BaseGames.VFX.asmdef` | ✅ | 新增 `BaseGames.Player` 引用(PaletteSwapSystem 需要 FormType) |
|
||||
| `CombatSFXController.cs` | ✅ | P2-8 SFX 钩子:所有字段由 `AudioClip` 升级为 `AudioEventSO`;播放改为 `GlobalSFXPlayer.Play(sfx, pos)`,支持随机音量/音调/多片段 |
|
||||
|
||||
@@ -63,7 +63,7 @@ Week 14: MapModule(Fog 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; // 水下专属 Volume(WeightMode)
|
||||
[SerializeField] private float _blendInDuration = 0.3f;
|
||||
[SerializeField] private float _blendOutDuration = 0.3f;
|
||||
[SerializeField] private LiquidEventChannelSO _onLiquidEntered; // ⚠️ EVT_LiquidEntered(payload: LiquidZone)
|
||||
[SerializeField] private VoidEventChannelSO _onLiquidExited; // ⚠️ EVT_LiquidExited
|
||||
[SerializeField] private LiquidEventChannelSO _onLiquidEntered; // EVT_LiquidEntered(payload: 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-5,2026-05-11)
|
||||
|
||||
**参考文档**:`15_MapShopModule.md`
|
||||
|
||||
@@ -3624,6 +3641,58 @@ public static class SaveMigrator
|
||||
|
||||
## 7. 完成标准检查清单
|
||||
|
||||
### Week 10 已完成实现(2026-05-10)
|
||||
|
||||
| 文件 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| `WorldStateRegistry.cs` | ✅ | ScriptableObject,Contains/Mark 系列 API + HasFlag/SetFlag + LoadFromSave |
|
||||
| `InteractableDetector.cs` | ✅ | OverlapCircleAll + FindNearest + InputReaderSO.InteractEvent 绑定 |
|
||||
| `PlayerSpawnPoint.cs` | ✅ | TransitionId + SpawnPosition,Gizmo 绿球标记 |
|
||||
| `RoomTransition.cs` | ✅ | IInteractable,自动触发或按键,广播 `scene|transitionId` 字符串 |
|
||||
| `RoomController.cs` | ✅ | Start 切换 RoomCamera,GetSpawnPoint 查询出生点 |
|
||||
| `HazardZone.cs` | ✅ | 即死/定值伤害,RespawnType 枚举 |
|
||||
| `Collectible.cs` | ✅ | Geo/Item/HPOrb 三类,PlayerStats 直接调用 |
|
||||
| `DestructibleTile.cs` | ✅ | IDamageable,CheckDestroyCondition virtual hook,Start 读档恢复 |
|
||||
| `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` | ✅ | IDamageable,Proximity/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 |
|
||||
|
||||
```
|
||||
☑ InteractableDetector:OverlapCircleAll 检测最近交互物,驱动 UI 提示显示/隐藏(代码完成)
|
||||
☑ WorldStateRegistry:HashSet 持久化状态,LoadFromSave/GetAllFlags 接口完成
|
||||
☑ RoomTransition + RoomController + PlayerSpawnPoint:房间切换框架完成(待 SceneLoader 集成)
|
||||
☑ HazardZone:即死/定值伤害(代码完成,待 Unity 内配置 Layer 和 Tag 验证)
|
||||
☑ Collectible:Geo/Item/HPOrb 拾取(代码完成,待 Unity 内配置 Prefab 验证)
|
||||
☑ DestructibleTile + DirectionalDestructible:IDamageable + 方向校验(代码完成)
|
||||
☑ DirectionalInteractable + PhantomInteractable:三种触发模式 + WorldStateRegistry 持久化
|
||||
☑ MagicWall + SoftTerrain:标记组件(无逻辑)
|
||||
☑ MovingPlatform:三种移动模式 + Passenger SetParent 方案(代码完成)
|
||||
☑ CrumblePlatform:四态协程,MMF_Player 反馈(代码完成)
|
||||
☑ FalseWall:三种揭示条件 + IDamageable(代码完成)
|
||||
□ 场景内端对端验证(待 Unity 编辑器内装配 Prefab 并运行)
|
||||
□ Console 无 Error(Unity 编辑器内编译验证)
|
||||
```
|
||||
|
||||
### Week 11–14 待实施
|
||||
```
|
||||
□ 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(红色标记)
|
||||
□ MapRoomDataEditor(CustomEditor for MapRoomDataSO):Scene 内拖拽 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` ISaveable(MapPin/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` 的引用,标红孤儿 key(0 引用),标黄单次引用 key,标绿 ≥2 次引用 key,支持导出 CSV(架构 13 §11,P3 优化)。
|
||||
|
||||
**Phase 3 完成后进入 Phase 4。**
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
> **周期**:3–4 周(Week 15–18)
|
||||
> **前置条件**:Phase 3 全部完成标准通过
|
||||
> **核心目标**:Boss 技能系统、叙事/对话/过场、按键重绑定、完整 UI 面板、支撑系统(本地化/成就/Steam/调试工具)、编辑器工具、QA 就绪
|
||||
> **产出物**:游戏发布前技术层面全部完成,可进入内容填充 + 关卡设计阶段
|
||||
> **产出物**:游戏发布前技术层面全部完成,可进入内容填充 + 关卡设计阶段
|
||||
> **状态**:✅ 全部完成(2026-05-11,P4-1~P4-6 全部 ✅)
|
||||
|
||||
---
|
||||
|
||||
@@ -75,7 +76,7 @@ Week 18: LocalizationManager(Unity Localization 包)
|
||||
|
||||
---
|
||||
|
||||
## 2. Week 15:Boss 技能系统完整
|
||||
## 2. Week 15:Boss 技能系统完整 ✅ 完成(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 17:UI 完整面板 + 按键重绑定
|
||||
## 4. Week 17:UI 完整面板 + 按键重绑定 ✅ 完成(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()` 下穿 API;Editor 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 执行
|
||||
|
||||
|
||||
Reference in New Issue
Block a user