多轮审查和修复

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

@@ -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)`,支持随机音量/音调/多片段 |