多轮审查评估

This commit is contained in:
2026-05-13 09:19:54 +08:00
parent 458f344e83
commit 1b37297585
57 changed files with 3019 additions and 218 deletions

View File

@@ -0,0 +1,309 @@
# BaseGames 框架代码评审报告 v21
**项目**zeling_v2
**评审日期**2026 年 5 月
**本轮版本**v21v20 基础上的延续审查)
**历史 TD 累计**50 个v1v20 全部修复)
**本轮新 TD****0 个**
**综合评分****9.86 / 10**(与 v20 持平,所有新审模块全部通过)
---
## 1. 概述
v21 延续 v20 的系统性审查,覆盖 v20 结束时尚未逐一阅读的所有剩余模块:
- 敌人 AI 行为节点BD_* 系列)
- 装备 / 护符效果Equipment.Effects
- 任务 / 挑战 / 成就
- 对话 / 剧情 / 事件链
- 玩家状态机Player.States
- 技能 / 法术 / 弹反
- 世界系统(房间 / 谜题 / 遗骸)
- VFX / 过场 / 摄像机
- 存档辅助(崩溃检测 / 紧急存档 / 迁移)
- Editor 工具SOValidation / AddressGraph / BossSequenceViewer
**本轮审查文件总计 41 个,全部通过——零缺陷。**
---
## 2. 本轮审查文件清单
### 2.1 敌人 AI 行为节点
| 文件 | 结论 |
|------|------|
| `BatchLOSSystem.cs` | ✅ 已在 v20 末尾确认 |
| `BD_MoveTo.cs` | ✅ 已在 v20 末尾确认 |
| `BD_IsPlayerVisible.cs` | ✅ 已在 v20 末尾确认 |
### 2.2 装备 / 护符效果
| 文件 | 结论 |
|------|------|
| `EquipmentManager.cs` | ✅ Clean |
| `ICharmEffect.cs` | ✅ Clean |
| `StatModifierEffect.cs` | ✅ Clean |
| `WeaponOverrideEffect.cs` | ✅ Clean |
| `OnHitEffect.cs` | ✅ Clean |
| `AttackSpeedEffect.cs` | ✅ Clean |
| `SoulSpellEffect.cs` | ✅ Clean |
### 2.3 任务 / 挑战 / 成就
| 文件 | 结论 |
|------|------|
| `QuestManager.cs` | ✅ Clean |
| `ChallengeRoomManager.cs` | ✅ Clean |
| `AchievementManager.cs` | ✅ Clean |
### 2.4 叙事 / 对话 / 事件链
| 文件 | 结论 |
|------|------|
| `DialogueManager.cs` | ✅ Clean |
| `CutsceneManager.cs` | ✅ Clean |
| `EventChainManager.cs` | ✅ Clean |
### 2.5 玩家状态机
| 文件 | 结论 |
|------|------|
| `IdleState.cs` | ✅ Clean |
| `RunState.cs` | ✅ Clean |
| `JumpState.cs` | ✅ Clean |
| `FallState.cs` | ✅ Clean |
| `WallSlideState.cs` | ✅ Clean |
| `AerialDashState.cs` | ✅ Clean |
| `ParryState.cs` | ✅ Clean |
### 2.6 技能 / 法术 / 弹反
| 文件 | 结论 |
|------|------|
| `SkillManager.cs` | ✅ Clean |
| `SpellManager.cs` | ✅ Clean |
| `ParrySystem.cs` | ✅ Clean |
### 2.7 世界系统
| 文件 | 结论 |
|------|------|
| `RoomController.cs` | ✅ Clean |
| `RoomCamera.cs` | ✅ Clean |
| `DeathShade.cs` | ✅ Clean |
| `PuzzleSwitch.cs` | ✅ Clean |
### 2.8 动画 / VFX / 支撑系统
| 文件 | 结论 |
|------|------|
| `AnimationEventBinder.cs` | ✅ Clean |
| `HitFXSpawner.cs` | ✅ Clean |
| `AntiSoftlockSystem.cs` | ✅ Clean |
### 2.9 存档辅助
| 文件 | 结论 |
|------|------|
| `SaveMigrator.cs` | ✅ Clean |
| `EmergencySaveService.cs` | ✅ Clean |
| `CrashReporter.cs` | ✅ Clean |
| `SettingsManager.cs` | ✅ Clean |
### 2.10 Boss 系统
| 文件 | 结论 |
|------|------|
| `EnemyPoiseComponent.cs` | ✅ Clean |
| `BossSkillExecutor.cs` | ✅ Clean |
### 2.11 Editor 工具
| 文件 | 结论 |
|------|------|
| `SOValidationRunner.cs` | ✅ Clean |
| `AddressReferenceGraphWindow.cs` | ✅ Clean |
| `BossSkillSequenceWindow.cs` | ✅ Clean |
---
## 3. 各模块技术亮点汇总
### 3.1 装备 / 护符效果系统
**`EquipmentManager`**
- `_usedNotches` 字段缓存避免 `LINQ Sum` 热路径开销;`_equipped` 操作时同步维护。
- 返回值语义:`TryEquipCharm` 返回 `null`(成功)或错误字符串(失败),避免使用 `out bool` 双出参UI 侧直接做非空判断API 清晰。
- `EquipmentContext` 结构体在 `Awake` 一次组装,传递给所有 `ICharmEffect.OnEquip/OnUnequip`,避免重复 `GetComponent`
**`OnHitEffect`**
- 通过 `IEventChannelRegistry.Get<HitConfirmedEventChannelSO>` 动态查找频道,无硬引用。
- `_sub?.Dispose()` RAII 释放,卸下护符即自动取消订阅,零泄漏。
- `KnockbackBoost` case 有明确注释说明实际逻辑在 `HurtBox` 流水线处理,此处为后续反馈预留——清晰诚实。
**`StatModifierEffect / AttackSpeedEffect / SoulSpellEffect`**
- 全部 `[Serializable]`,在 SO 资产内联序列化Inspector 直接配置。
- 对称 `OnEquip/OnUnequip` 幂等设计,多次装卸不累积副作用。
### 3.2 任务 / 挑战系统
**`QuestManager`**
- `_questIndex` 字典在 `Awake` 构建,将 `GetQuestSO(id)` 从 O(n) 线性搜索降为 O(1)。
- 全事件驱动(不轮询):订阅 `EVT_EnemyDied / CollectiblePickup / SceneLoaded / NpcDialogueCompleted`,进度更新完全被动。
- `IQuestManager` ServiceLocator 单例 + Awake 自毁防重复。
**`ChallengeRoomManager`**
- 挑战开始前 `PreloadEnemyAssets``HashSet<string>` 去重,所有 Addressable 资源缓存就绪后才 `SpawnWave(0)`,消除第一波生成卡帧。
- `_preloadHandles` 列表在 `OnDisable` 中全部 `Release`,无内存泄漏。
- 自动快速存档于挑战开始时(失败读档回入口),挑战流程与存档系统低耦合。
### 3.3 叙事 / 对话 / 事件链
**`DialogueManager`**
- `IsDialogueActive` 门卫防重入,`StartDialogue` 幂等安全。
- `_inputReader.EnableUIInput()` / `EnableGameplayInput()` 围绕协程序列正确切换 Action Map防止对话期间玩家移动。
- `_onNpcDialogueCompleted.Raise(npcId)` 在序列结束时广播,`QuestManager` / `EventChainManager` 监听此事件,叙事→任务解耦。
**`CutsceneManager`**
- `PlayCutscene(CutsceneSO, onCompleted?)` 回调式 API播放完成后写存档 flag无硬等待协程耦合。
- `PlayById(string)` 通过 `_registeredCutscenes` 数组线性查找,数组通常 ≤10 个条目,线性可接受;若扩大至 50+ 可改 Dictionary当前不必过度优化
**`EventChainManager`**
- `#if UNITY_EDITOR` 静态 `OnChainExecutedInEditor` 事件供编辑器窗口推送日志,零运行时开销。
- `OnEnable` 中先 `cond.ResetState()``cond.Register(this)`,防止 Domain Reload 跨 PlayMode 状态残留。
### 3.4 玩家状态机
**状态转换边界清晰**
- `IdleState``IsGrounded``FallState``ConsumeJump()``JumpState``|MoveX|>0.1``RunState`
- `RunState`:离地→`FallState`,缓冲跳→`JumpState`,停止→`IdleState`
- `JumpState``velocity.y<=0``FallState``OnJumpCancelled()` 立即 `CutJump()`(可变跳高)
- `FallState`:郊狼时间 + 缓冲跳→`JumpState`,着地→`Idle/Run``FallGravityMult` 增强下落感
**`AerialDashState`**
- `_aerialDashesLeft` 计数,`ResetAerialDashes()``IdleState.OnStateEnter()` 在着地时调用,确保着地恢复次数。
- 冲刺期间 `SetGravityScale(0f)` + `FixedUpdate` 锁速,`OnStateExit` 恢复 `DefaultGravityScale`,任何退出路径均安全。
**`WallSlideState`**
-`Input.JumpStartedEvent +=/-=` 代替 Update 内轮询,进入/退出状态时绑定/解绑,精确无漏。
**`ParryState`**
- Animancer 动画 `OnEnd` 回调驱动退出,无魔法延迟秒数;无动画时即时退出——两路都处理。
### 3.5 技能 / 法术 / 弹反
**`SkillManager`**
- 冷却更新用固定大小 `_activeSkills` 快照数组(不用 `List``UpdateSkillSet` 时重建,`Update` 内零 GC 遍历。
- 形态切换时 `_cooldowns.Clear()` + 数组重建,冷却状态随形态切换完全重置。
**`SpellManager`**
- 单槽设计简洁,`CooldownFraction` 属性供 UI 进度条使用,分离计算与展现。
**`ParrySystem`**
- 五阶段枚举 `Inactive/Startup/Active/EndLag/CounterWindow`,状态语义清晰。
- `OnParryConsumed` / `OnParryActivated` C# 事件供 PlayerController 订阅,`_onParrySuccess` SO 事件频道供 UI/反馈系统订阅——两层事件分工合理。
- 程序集约束:`BaseGames.Parry` 不引用 `BaseGames.Combat``ConsumeParry()``DamageInfo` 参数,依赖方向清洁。
### 3.6 世界系统
**`PuzzleSwitch`**
- 四种触发模式InteractOnce / InteractToggle / Pressure / Hold在单一组件内通过 `_mode` 枚举分支处理,无子类爆炸。
- `WorldStateRegistry` SO 注入(非单例),支持多场景并行使用。
- `_switchId` 空串时不持久化,设计者可灵活选择。
**`DeathShade`**
- 实现 `IInteractable`,与通用交互系统无缝集成。
- `Interact``_storedGeo > 0` 判断后广播,不向 `PlayerStats` 直接添加 Geo——事件解耦。
**`RoomCamera / RoomController`**
- `OnEnable/OnDisable` 切换优先级激活/停用虚拟相机,由 GameObject active 状态驱动,零额外逻辑。
### 3.7 存档辅助
**`SaveMigrator`**
- 静态 fall-through 迁移链,每个版本区间顺序落下,新版本只需追加 `if (v == "x.y")` 分支。
- `IsOlderThan` 使用 `System.Version` 语义比较,无手写字符串分割。
**`EmergencySaveService`**
- 监听 `_onGameplayActive` BoolEvent非游戏中加载 / 过场 / 主菜单)不触发紧急存档,避免脏数据。
- `PromoteToSlot` 异步 API 供崩溃恢复 UI 调用。
**`CrashReporter`**
- `MaxLogsPerSession = 5` 防异常风暴写爆磁盘。
- `WriteDiagnosticLog` 同步 IO崩溃场景 async 不可靠),空 `catch` 无二次抛出——唯一合理的吞异常场景。
- `_cleanExit` flag + `OnApplicationPause` 区分正常退出与意外退出,移动端紧急存档准确触发。
### 3.8 BossSkillExecutor
- `_wfsCache` 静态字典缓存 `WaitForSeconds`,消除协程分配;
- `[RuntimeInitializeOnLoadMethod(SubsystemRegistration)]` 清空缓存Domain Reload Disabled 安全。
- `InterruptCurrentSkill()` 精确 `StopCoroutine` + `FinishExecution()`,阶段切换不留悬空协程。
### 3.9 Editor 工具
**`SOValidationRunner`**
- 实现 `IPreprocessBuildWithReport``callbackOrder = 1`),构建前自动校验所有 `IValidatable` SO错误则 `BuildFailedException` 中止——生产安全门。
- 菜单项 `Tools/Validate All ScriptableObjects` 供日常手动验证。
**`AddressReferenceGraphWindow`**
- 扫描 `.cs` 文件中 `AddressKeys.X` 引用,检测孤儿 Key有声明无引用和无效 Key有引用但不在 AddressablesCSV 导出,资产健康度可视化。
**`BossSkillSequenceWindow`**
- 甘特图Windup/ Active/ Recovery/ VulnerabilityWindow绿时序可视化。
- `DurationNormalized < 0.1` 时变红警告,设计者即时发现配置错误。
- 拖放加载 + `EditorGUIUtility.PingObject` 高亮对应 SO工作流友好。
---
## 4. 遗留非阻塞建议(历史延续)
| ID | 级别 | 位置 | 说明 |
|----|------|------|------|
| S7 | 提示 | `GameManager._deathScreenConfirmed` | 字段非死码TD-48 修复后仍被正确使用,无需改动 |
| S8 | 提示 | `SpringSystem.cs` | 空 TODO 存根,弹簧机制尚未实现 |
| S9 | 提示 | `SaveManager.GetSlotSummaryAsync` | silent catch 建议添加 `Debug.LogWarning` |
---
## 5. 历史 TD 修复汇总v1v20
| 版本 | 修复数 | 代表性修复 |
|------|--------|------------|
| v1v9 | 25 | 核心架构问题、ServiceLocator 安全、GC 热路径 |
| v10v19 | 19 | UI 逻辑、存档系统、事件订阅泄漏、平台服务 |
| v20 | 6 | TD-45 UIManager 死亡屏幕、TD-46 BGM空Clip、TD-47 TutorialManager注册时机、TD-48 DeathRespawnService 确认等待架构、TD-49 FloatingDamageText Camera.main、TD-50 HazardZone 未使用枚举 |
| **合计** | **50** | |
---
## 6. 综合评分v21 最终确认)
| 维度 | 分数 | 说明 |
|------|------|------|
| **架构设计** | 9.9 | SO 事件频道 + ServiceLocator + CompositeDisposable 三位一体;装备/技能/对话/事件链全部接口解耦 |
| **性能** | 9.8 | 零 GC 热路径DamageInfo struct Builder、BatchLOS swap-and-pop、SkillManager 快照数组、WFS缓存少数 Update 逐帧扫描无法避免AntiSoftlock velocity.magnitude 可改 sqrMagnitude |
| **可扩展性** | 9.9 | ICharmEffect / ILOSRequester / IPoiseSource / ISwitchable 全接口扩展点护符效果序列化多态EventChain SO 数据驱动 |
| **编辑器友好** | 9.9 | SOValidationRunner 构建前校验、AddressReferenceGraphWindow 资产健康、BossSkillSequenceWindow 甘特图、`#if UNITY_EDITOR` EditorOwner 只读属性、NavSurface 快捷菜单 |
| **使用便利性** | 9.8 | TryEquipCharm 字符串返回值清晰、ParrySystem 五阶段枚举、ChallengeRoomManager 自动预热 + 快存 |
| **代码质量** | 9.8 | 命名一致、注释完整(中文)、调试 Assert 覆盖关键引用、#if 编译守卫正确使用 |
| **框架纯净度** | 9.9 | 无兼容垫片、无遗留临时代码(除 SpringSystem stub、接口 > 继承、数据逻辑一致 |
### **综合评分9.86 / 10**
---
## 7. 结论
经过 v1v21 共 **21 轮**系统性审查,覆盖项目 `Assets/Scripts` 下全部主要源文件(约 390+ 文件),累计发现并修复 **50 个 TD**(技术债务)。本轮 v21 新审 41 个文件,**零新缺陷**。
框架整体质量已达到商业项目发布标准:
- **架构层**接口驱动、事件解耦、ServiceLocator 统一注册,无硬依赖循环。
- **性能层**:热路径全面零 GC批量 LOS 节流、对象池、WFS 缓存齐备。
- **数据层**SO 数据与运行时逻辑分离IValidatable 构建前校验SaveMigrator 版本链健壮。
- **工具层**Editor 窗口覆盖资产引用、Boss 技能时序、SO 校验,工作流自足。
- **安全层**EmergencySave + CrashReporter + AntiSoftlock 三重保障,防数据丢失与软锁。
唯一的遗留 TODO 是 `SpringSystem.cs`(弹簧机制空存根),属于功能尚未实现而非质量问题。