新增全阶段验收测试文档 AcceptanceTest_All_Phases.md(P0–P4,100 条 TC + 5 条 E2E)

This commit is contained in:
2026-05-12 17:02:36 +08:00
parent 301691d1a0
commit 2b2a74da42

View File

@@ -0,0 +1,597 @@
# Zeling v2 · 全阶段验收测试文档
> **文档版本**1.0
> **覆盖范围**Phase 0 → Phase 4`Assets/Scripts/` 全量代码)
> **Unity 版本**2022.3 LTS
> **前置文档**`Docs/Verification/Phase1_Verification_Guide.md`Phase 0/1 详细步骤,本文在此基础上新增 Phase 24 验收)
> **测试环境**Unity Editor Play Mode测试房间场景`TestRoom.unity`Persistent 场景同时加载
---
## 目录
1. [测试前环境检查清单](#1-测试前环境检查清单)
2. [阶段验收状态总览](#2-阶段验收状态总览)
3. [P0 基础设施(快速回归)](#3-p0-基础设施快速回归)
4. [P1 核心系统(快速回归)](#4-p1-核心系统快速回归)
5. [P2 核心玩法扩展](#5-p2-核心玩法扩展)
- [5.1 玩家 FSM 完整状态](#51-玩家-fsm-完整状态)
- [5.2 形态切换与武器系统](#52-形态切换与武器系统)
- [5.3 完整连击链](#53-完整连击链)
- [5.4 弹反系统](#54-弹反系统)
- [5.5 护盾与霸体Poise](#55-护盾与霸体poise)
- [5.6 状态效果系统](#56-状态效果系统)
- [5.7 VFX 与 Feedback 扩展](#57-vfx-与-feedback-扩展)
- [5.8 音频 Mixer 快照](#58-音频-mixer-快照)
- [5.9 难度系统](#59-难度系统)
- [5.10 敌人扩展(远程 / 飞行 / Boss 骨架)](#510-敌人扩展远程--飞行--boss-骨架)
6. [P3 世界与进程系统](#6-p3-世界与进程系统)
- [6.1 房间切换与场景管理](#61-房间切换与场景管理)
- [6.2 世界互动机关](#62-世界互动机关)
- [6.3 WorldStateRegistry 持久化](#63-worldstateregistry-持久化)
- [6.4 液态谜题系统](#64-液态谜题系统)
- [6.5 能力解锁与能力门禁](#65-能力解锁与能力门禁)
- [6.6 护符与装备系统](#66-护符与装备系统)
- [6.7 技能管理器与修改器](#67-技能管理器与修改器)
- [6.8 任务系统](#68-任务系统)
- [6.9 挑战房间](#69-挑战房间)
- [6.10 地图模块](#610-地图模块)
- [6.11 商店系统](#611-商店系统)
7. [P4 内容与完善](#7-p4-内容与完善)
- [7.1 Boss 技能系统](#71-boss-技能系统)
- [7.2 对话与叙事模块](#72-对话与叙事模块)
- [7.3 事件链与过场](#73-事件链与过场)
- [7.4 UI 完整面板](#74-ui-完整面板)
- [7.5 按键重绑定](#75-按键重绑定)
- [7.6 本地化系统](#76-本地化系统)
- [7.7 成就系统](#77-成就系统)
- [7.8 平台支撑Steam / 存档云同步)](#78-平台支撑steam--存档云同步)
- [7.9 支撑模块(调试 / 无卡点 / 无障碍 / 速通)](#79-支撑模块调试--无卡点--无障碍--速通)
8. [全流程端到端验证](#8-全流程端到端验证)
9. [验收通过标准](#9-验收通过标准)
10. [缺陷登记表](#10-缺陷登记表)
---
## 1. 测试前环境检查清单
在任意测试用例运行前,必须确认以下项全部通过:
| # | 检查项 | 验证方式 | 状态 |
|---|--------|---------|------|
| ENV-01 | Console 无红色 Error | `Window → Console` 错误数 = 0 | ☐ |
| ENV-02 | Addressables 已构建 | `Window → Addressables → Groups → Build → New Build → Default` | ☐ |
| ENV-03 | NavSurface 已烘焙 | Scene 视图可见蓝绿导航网格 Gizmo | ☐ |
| ENV-04 | Physics2D Layer 矩阵已配置 | `Edit → Project Settings → Physics 2D`PlayerHitBox ↔ EnemyHurtBox 碰撞开启 | ☐ |
| ENV-05 | SO 事件资产存在 | `Assets/Data/Events/` 下有 `EVT_*.asset` 文件 | ☐ |
| ENV-06 | Persistent 场景已加入 Build Settings | `File → Build Settings`Persistent.unity 位于列表第一位 | ☐ |
| ENV-07 | Domain Reload 设置确认 | `Edit → Project Settings → Editor → Enter Play Mode Options`,勾选 `Disable Domain Reload` 时验证静态字典缓存行为 | ☐ |
> **注意**ENV-07 主要影响 `BossSkillExecutor._wfsCache`、`WaitForSecondsCache` 等静态字典。若 Disable Domain Reload 开启,每次 Play Mode 前需手动触发清空(或保持默认:不禁用 Domain Reload
---
## 2. 阶段验收状态总览
| Phase | 代码状态 | 资产状态 | 验收状态 |
|-------|---------|---------|---------|
| P0 基础设施 | ✅ 完成 | ✅ 完成 | ☐ 待验 |
| P1 垂直切片 | ✅ 完成 | ⚠️ 需场景搭建 | ☐ 待验 |
| P2 核心玩法 | ✅ 完成 | ⚠️ VFX 资产待填充 | ☐ 待验 |
| P3 世界进程 | ✅ 完成 | ⚠️ Prefab 装配待完成 | ☐ 待验 |
| P4 内容完善 | ✅ 完成 | ✅ 完成 | ☐ 待验 |
---
## 3. P0 基础设施(快速回归)
> 此阶段已在 Phase1_Verification_Guide.md V1V3 详细验证,此处仅快速回归确认。
| TC-ID | 测试项 | 步骤 | 期望结果 | ☐ |
|-------|-------|------|---------|---|
| TC-P0-01 | asmdef 编译无错 | Unity 菜单 → Assets → Open C# ProjectIDE 执行 Rebuild | 0 个编译错误 | ☐ |
| TC-P0-02 | ServiceLocator 注册/获取 | Play 进入 Persistent 场景Console 搜索 `[ServiceLocator]` | 无 `NullReferenceException`核心服务SaveManager / ObjectPool / AudioManager / SceneLoader注册成功 | ☐ |
| TC-P0-03 | SO 事件系统 | 在 Inspector 打开任意 `EVT_*.asset`,点击 Raise 按钮 | Console 输出对应频道事件(开启 EventBusMonitor Window | ☐ |
| TC-P0-04 | Addressables 加载 | Play Mode 下 `AssetLoader.LoadAsync` 通过 AddressKey 加载一个 Prefab | Prefab 实例化无 `InvalidKeyException` | ☐ |
| TC-P0-05 | SaveManager 读写 | 调用 `SaveManager.SaveAsync(slot:0)`Exit Play Mode再次 Enter Play Mode 调用 `LoadAsync(0)` | 存档文件存在于磁盘,加载后 Console 无 checksum 错误 | ☐ |
---
## 4. P1 核心系统(快速回归)
> 详细验证步骤见 `Phase1_Verification_Guide.md`,此处列出快速回归清单。
| TC-ID | 测试项 | 期望结果 | ☐ |
|-------|-------|---------|---|
| TC-P1-01 | 输入系统 | WASD/方向键控制玩家移动Space 跳跃Z 攻击Esc 暂停,无按键漏检 | ☐ |
| TC-P1-02 | Animancer FSM | Idle→Run→Jump→Fall 状态转换流畅,无动画卡帧 | ☐ |
| TC-P1-03 | PlayerMovement 物理 | 地面正常重力跳跃弧线正确土狼时间Coyote有效 | ☐ |
| TC-P1-04 | 战斗管道 | 攻击敌人触发伤害数字,敌人 HP 减少;受到敌人攻击,玩家 HP 减少 | ☐ |
| TC-P1-05 | 敌人寻路 AI | 敌人巡逻,玩家进入视野后追击并攻击 | ☐ |
| TC-P1-06 | 存档点完整流程 | 与 SavePoint 交互 → 触发存档 → 死亡 → 复活在存档点 → HP/灵力满值 | ☐ |
| TC-P1-07 | HUD 显示 | HP 条/灵力条/Geo 数量随游戏状态正确更新 | ☐ |
| TC-P1-08 | 相机系统 | 玩家进入 CameraTriggerZone 时相机平滑切换到目标房间 | ☐ |
---
## 5. P2 核心玩法扩展
### 5.1 玩家 FSM 完整状态
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-01 | DashState 冲刺 | 地面状态按冲刺键(默认 LeftShift | 玩家水平快速位移,冲刺期间无敌帧生效(敌人攻击不触发 HurtState结束后自然过渡 Idle/Run | ☐ |
| TC-P2-02 | AerialDashState 空中冲刺 | 跳跃后按冲刺键 | 空中水平冲刺,消耗空中冲刺次数;落地后次数重置 | ☐ |
| TC-P2-03 | WallSlideState 蹬墙下滑 | 跳跃后贴近墙壁按住方向 | 下滑速度减缓(`wallSlideSpeed`Wall Slide 动画播放 | ☐ |
| TC-P2-04 | WallJumpState 蹬墙跳 | WallSlide 状态按跳跃键 | 玩家弹离墙壁(`wallJumpForce`),方向翻转 | ☐ |
| TC-P2-05 | HurtState 受击硬直 | 被攻击未被霸体保护 | 受击动画播放,持续 `hurtDuration`,期间不可输入 | ☐ |
| TC-P2-06 | DeadState 死亡冻结 | HP 归零 | 死亡动画物理冻结Rigidbody2D.constraints死亡屏幕出现 | ☐ |
| TC-P2-07 | SpringState 使用灵泉 | 持有灵泉时按治疗键 | 治疗动画HP 恢复,灵泉数量-1不可打断HurtState 优先级低于 SpringState 硬直期) | ☐ |
---
### 5.2 形态切换与武器系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-08 | 三形态切换 | 按形态切换键循环Sky→Earth→Death→Sky | 每次切换玩家调色板更新Palette Swap武器 HitBox 伤害来源刷新HUD 形态图标同步 | ☐ |
| TC-P2-09 | FormController 事件广播 | 切换形态后检查 Console开启 EventBusMonitor | `EVT_FormChanged` 频道触发,`EVT_SkillSetChanged` 频道触发 | ☐ |
| TC-P2-10 | WeaponManager 武器数据刷新 | 切换形态后攻击敌人 | 不同形态输出不同 DamageSource 的伤害值(需三形态武器 SO 伤害值不同) | ☐ |
| TC-P2-11 | SaveData 形态持久化 | 切换到 Earth 形态 → 存档 → 重载 | 重载后当前形态仍为 Earth | ☐ |
---
### 5.3 完整连击链
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-12 | 地面 3 段连击 | 连续按 3 次攻击(间隔在 Combo 窗口内) | 播放 Attack1 → Attack2 → Attack3 三段动画,第 3 段结束后返回 Idle不可延续第 4 段 | ☐ |
| TC-P2-13 | 连击超时重置 | 按 1 次攻击后等待超时 | Combo 计数重置到 Attack1再按攻击仍从头开始 | ☐ |
| TC-P2-14 | 空中攻击 | 跳跃后按攻击键 | 播放 AirAttack 动画HitBox 激活(正前方) | ☐ |
| TC-P2-15 | 下劈DownAttack | 跳跃后向下+攻击 | 播放 DownAttack 动画,检测到下方敌人时反弹(`trampolineForce` | ☐ |
| TC-P2-16 | 上劈UpAttack | 地面状态向上+攻击 | 播放 UpAttack 动画HitBox 激活(正上方) | ☐ |
| TC-P2-17 | HitBox 激活时序 | 使用 Unity Physics Debugger 或 Console 输出 | HitBox 仅在动画攻击帧 Active其他帧 Deactivate无穿透判定 | ☐ |
| TC-P2-18 | 命中灵力增加 | 攻击命中敌人 | 玩家灵力条SoulPower增加HUD 同步更新 | ☐ |
---
### 5.4 弹反系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-19 | 弹反触发 | 弹反键(默认 Q在敌人攻击命中前 `parryWindow` 秒内按下 | 弹反成功:敌人进入受击僵直(`parriedStunDuration`玩家不扣血ParryFlash VFX 播放 | ☐ |
| TC-P2-20 | 弹反窗口外按键 | 过早或过晚按弹反键 | 弹反失败,玩家正常受击,无 ParryFlash | ☐ |
| TC-P2-21 | 弹反计数事件 | 成功弹反后检查 Console | `EVT_ParrySuccess` 频道触发,`Stats.ParryCount` +1用于 ParryCountCondition 成就) | ☐ |
| TC-P2-22 | 不可弹反攻击 | 敌人使用标记为 `Unblockable`InteractionTag的攻击时尝试弹反 | 弹反无效,玩家正常受击,无 ParryFlash | ☐ |
| TC-P2-23 | 弹反冷却 | 成功弹反后立即再次按弹反键 | 弹反冷却期间无效(`parryCooldown`CD 期间 UI 弹反图标变灰(若实现) | ☐ |
---
### 5.5 护盾与霸体Poise
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-24 | ShieldComponent 护盾吸收 | 装备护盾护符后受到攻击 | 护盾先扣除伤害,护盾耗尽后 HP 才扣减;护盾恢复计时器启动 | ☐ |
| TC-P2-25 | 霸体Poise保护 | 重攻击(`Break Level >= poise`)触发 HurtState普通攻击低于 poise不触发 | 霸体值足够时攻击动画不被打断,霸体耗尽后下次攻击触发 HurtState | ☐ |
| TC-P2-26 | 霸体恢复 | 玩家停止受击一段时间 | 霸体值按 `poiseRecoveryRate` 恢复至满值 | ☐ |
---
### 5.6 状态效果系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-27 | Poison 中毒效果 | 使敌人/玩家受到 Poison StatusEffect通过调试工具或专用敌人 | 每 `tickInterval` 秒扣除 `tickDamage` 血量,持续 `duration` 秒后自动移除VFX 粒子(绿色)在角色上显示 | ☐ |
| TC-P2-28 | Burn 燃烧效果 | 触发 Burn | 类似 PoisonVFX 为橙红色,效果叠加计算(若实现 stack | ☐ |
| TC-P2-29 | Stagger 硬直效果 | 触发 Stagger | 目标进入硬直动画,`staggerDuration` 秒内无法行动 | ☐ |
| TC-P2-30 | 状态效果叠加 | 同时触发 Poison + Burn | 两个效果独立计时互不覆盖StatusEffectManager 分别管理) | ☐ |
| TC-P2-31 | 状态效果免疫 | 对标记为免疫DamageFlags 或 StatusResistance的目标施加效果 | 效果不附着Console 无报错 | ☐ |
---
### 5.7 VFX 与 Feedback 扩展
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-32 | HitFX 分类型播放 | 不同 HitFxType 攻击命中(斩击/钝击/魔法) | `VFXCatalogSO.TryGetHitFX` 正确查表,对应 VFX Prefab 从对象池生成,无 `Debug.Assert` 失败 | ☐ |
| TC-P2-33 | HurtFlash 受击闪白 | 玩家受击 | HurtFlash 动画播放,`WaitForSeconds` 使用缓存无 GCProfiler 确认) | ☐ |
| TC-P2-34 | ParryFlash VFX | 弹反成功 | ParryFlash 粒子从对象池生成后自动归还(`PooledObject.ReturnToPool` | ☐ |
| TC-P2-35 | FormSwitch VFX | 切换形态 | 形态切换 VFX颜色渐变或粒子播放`MMF_Player` 事件触发 | ☐ |
| TC-P2-36 | Feel MMF_Player 反馈链 | 攻击/受击/弹反等事件触发 | `PlayerFeedback.cs` 各方法PlayAttack/PlayHurt/PlayParry正确触发对应 MMF_Player无反射调用 | ☐ |
---
### 5.8 音频 Mixer 快照
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-37 | 战斗快照切换 | 玩家进入敌人 Alert 范围 | AudioMixer 渐变到战斗快照(鼓点增强,环境音淡出),过渡时长符合配置 | ☐ |
| TC-P2-38 | 平静快照恢复 | 击败所有敌人或离开战斗区 | AudioMixer 渐变回平静快照 | ☐ |
| TC-P2-39 | 形态 BGM 切换 | 切换形态 | BGM 切换到对应形态音轨,旧轨道淡出(双 AudioSource 交叉淡入) | ☐ |
---
### 5.9 难度系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-40 | 难度切换数值注入 | 在 SettingsPanel 切换难度Easy/Normal/Hard | `DifficultyManager.ApplyDifficulty()` 调用,`EnemyStats` 的伤害/HP 乘数按 `DifficultyScalerSO` 更新,`PlayerStats` 受伤倍率更新 | ☐ |
| TC-P2-41 | 难度数值持久化 | 切换 Hard → 存档 → 重载 | 重载后难度仍为 Hard乘数正确应用 | ☐ |
---
### 5.10 敌人扩展(远程 / 飞行 / Boss 骨架)
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P2-42 | RangedEnemy 远程攻击 | 玩家进入 RangedEnemy 视野 | 敌人在保持距离状态下发射弹射物(从对象池生成),弹射物命中玩家扣血 | ☐ |
| TC-P2-43 | FlyingEnemy 飞行巡逻 | FlyingEnemy 在场景中 | 不受地形约束飞行巡逻BatchLOSSystem 检测到玩家后追击,`IsPlayerVisible` 正确更新 | ☐ |
| TC-P2-44 | BossBase 血量分段 | BossBase 实例的 HP 降至配置阈值(如 50% | `BossBase.EnterPhase(1)` 被调用,`EVT_BossPhaseChanged` 频道广播Boss 进入第二阶段行为 | ☐ |
| TC-P2-45 | LootTableSO 掉落 | 击败有 LootTableSO 的敌人 | 按权重随机生成对应战利品Geo / 道具),无 `NullReferenceException` | ☐ |
---
## 6. P3 世界与进程系统
### 6.1 房间切换与场景管理
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-01 | 自动触发传送点 | 玩家走入 `_autoTrigger = true` 的 RoomTransition 碰撞体 | 场景切换启动:广播 `SceneLoadRequest`,旧场景卸载,新场景加载,玩家在 `EntryTransitionId` 对应 PlayerSpawnPoint 出现 | ☐ |
| TC-P3-02 | 交互键触发传送点 | 玩家走入 `_autoTrigger = false` 的传送点,按交互键 | 弹出交互提示InteractableDetector 管理),按键后触发场景切换 | ☐ |
| TC-P3-03 | 钥匙物品传送门 | 传送点设有 `requiredItemId`,玩家未持有时尝试进入 | 传送不触发,提示提示信息(如"需要 xx 钥匙" | ☐ |
| TC-P3-04 | Loading Screen | 场景切换时 `ShowLoadingScreen = true` 的传送请求 | Loading 画面出现并在新场景加载完成后淡出 | ☐ |
| TC-P3-05 | 多场景 Persistent 常驻 | 场景切换全程 | Persistent 场景全程不卸载ServiceLocator 中注册的服务始终有效 | ☐ |
| TC-P3-06 | 玩家位置记录BreadcrumbTracker | 玩家移动 30 秒 | `BreadcrumbTracker.GetRecentCrumbs(5)` 返回正确的近 5 个坐标,移动距离未超过阈值的位置不记录 | ☐ |
---
### 6.2 世界互动机关
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-07 | HazardZone 伤害 | 玩家进入 HazardZone 碰撞体 | 每 `_damageInterval` 秒扣除 `_damage` HP离开后停止 | ☐ |
| TC-P3-08 | Collectible Geo 拾取 | 玩家接触 Geo 收集物 | Geo 数量增加,收集物弹起后被自动吸附(若实现磁吸),`_collected` 标记防止重复拾取 | ☐ |
| TC-P3-09 | DestructibleTile 破坏 | 玩家攻击 DestructibleTile | 根据 `breakLevel` vs 攻击 `BreakLevel` 判断:满足时瓦片碎裂(替换 Tilemap 或 Destroy不满足时无效 | ☐ |
| TC-P3-10 | MovingPlatform 乘客跟随 | 玩家站上移动平台 | 玩家随平台移动,物理稳定无抖动;离开平台后父节点正确还原 | ☐ |
| TC-P3-11 | CrumblePlatform 崩塌 | 玩家站立在 CrumblePlatform 上 | 延迟 `_crumbleDelay` 秒后平台开始崩裂,`_respawnDelay` 秒后复原 | ☐ |
| TC-P3-12 | DirectionalInteractable 单向 | 从正确方向触发 DirectionalInteractable攻击/接触/按键) | 机关激活VoidEventChannel 广播;从错误方向触发无响应 | ☐ |
| TC-P3-13 | PhantomInteractable 太虚斩通过 | 玩家在 ShadowDecoy太虚斩形态下触碰 PhantomInteractable | 机关激活PhantomBody Layer 检测有效);普通形态触碰无效 | ☐ |
| TC-P3-14 | DeathShade Geo 回收 | 死亡后重生找到死亡遗骸DeathShade并交互 | Geo 增加(`_onGeoRecovered.Raise(geo)`DeathShade 销毁,`EVT_ShadeCollected` 触发 | ☐ |
| TC-P3-15 | InteractableDetector 最近物体 | 同时有多个可交互物在范围内 | 始终与最近的可交互物交互Gizmo 半径圈在编辑器下正确显示 | ☐ |
---
### 6.3 WorldStateRegistry 持久化
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-16 | 一次性机关状态保存 | 触发 `_isOneShot = true` 的 DirectionalInteractable → 存档 → 重载场景 | 机关已激活状态保留,`WorldStateRegistry.IsFlagSet(id)` 返回 true | ☐ |
| TC-P3-17 | 跨场景状态不丢失 | 触发机关 → 切换到另一个场景 → 返回 | 机关状态保持已激活(无重置) | ☐ |
---
### 6.4 液态谜题系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-18 | SwimState 游泳 | 玩家进入 LiquidZone 碰撞体 | 切换到 SwimState浮力应用游泳动画播放潜水键可下潜离开液体恢复原状态 | ☐ |
| TC-P3-19 | LiquidPuzzleController 谜题完成 | 操控 Valve/Pump/Drain 三件套达到谜题完成条件 | `LiquidPuzzleController.IsSolved` 变为 true广播相关事件机关门打开 | ☐ |
| TC-P3-20 | LiquidFlowSimulator 流向模拟 | 打开 Valve | 液体按重力/管道方向模拟流动(骨架级别验证:液位高度变化即可) | ☐ |
---
### 6.5 能力解锁与能力门禁
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-21 | AbilityUnlock 解锁演出 | 玩家进入 AbilityUnlock 触发区 | `MMF_Player` 反馈播放(无反射调用),等待 `_cutsceneDuration` 后调用 `PlayerStats.UnlockAbility()``EVT_AbilityUnlocked` 广播,组件销毁 | ☐ |
| TC-P3-22 | AbilityGate 阻挡 | 未解锁对应能力时走向 AbilityGate | 玩家无法通过碰撞体激活UI 提示"需要 xx 能力" | ☐ |
| TC-P3-23 | AbilityGate 实时开启 | 解锁能力后,已存在的 AbilityGate 响应 | 订阅 `AbilityTypeEventChannelSO` 的 AbilityGate 自动开启碰撞体,玩家可通过 | ☐ |
| TC-P3-24 | 能力持久化 | 解锁冲刺能力 → 存档 → 重载 | 重载后 `PlayerStats.HasAbility(AbilityType.Dash)` 仍为 true | ☐ |
---
### 6.6 护符与装备系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-25 | 护符装备生效 | 打开 InventoryPanel将某 CharmSO 拖入装备槽 | `EquipmentManager` 调用 `ICharmEffect.OnEquip(player)`,效果立即应用(如 HP+1、冲刺延长 | ☐ |
| TC-P3-26 | 护符卸除回滚 | 卸除已装备的护符 | `ICharmEffect.OnUnequip(player)` 回滚数值,效果消失 | ☐ |
| TC-P3-27 | 护符插槽限制 | 装备超过 `maxCharmSlots` 个护符 | 超出时提示"插槽不足",无法装备 | ☐ |
| TC-P3-28 | 护符持久化 | 装备护符 → 存档 → 重载 | 重载后护符仍处于装备状态,效果生效 | ☐ |
---
### 6.7 技能管理器与修改器
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-29 | 技能施放基础 | 形态切换到 Sky按 SoulSkill 键 | 执行 `FormSkillSO.effectType` 对应逻辑(如 MeleeAoE 触发范围攻击),消耗 `baseCost` 灵力,进入 `cooldown` | ☐ |
| TC-P3-30 | 技能冷却 | 施放后立即再按技能键 | 冷却中无法施放CD 结束后可再次施放 | ☐ |
| TC-P3-31 | SkillModifierRegistry 数值修改 | 装备影响某技能 Damage 的护符 | `SkillModifierRegistry.GetEffectiveParams()` 返回 `damageMult > 1.0f`,实际伤害增加 | ☐ |
| TC-P3-32 | SkillSlotOverride 技能替换 | 装备包含 `SkillSlotOverride` 的护符 | 指定形态/插槽的技能被替换为 `replacementSkill`HUD 显示新技能图标 | ☐ |
---
### 6.8 任务系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-33 | 任务接取 | 与 QuestGiver NPC 交互,选择接受任务 | `QuestManager.StartQuest(questSO)` 调用,任务出现在 Journal UI | ☐ |
| TC-P3-34 | 任务目标追踪 | 完成任务中"击败 N 个敌人"目标 | `QuestObjectiveSO.OnEnemyDefeated` 计数更新HUD 追踪数字变化 | ☐ |
| TC-P3-35 | 任务完成与奖励 | 满足所有目标后返回 QuestGiver | `QuestManager.CompleteQuest(id)` 调用,`IRewardTarget.GiveReward()` 执行Geo/物品/能力奖励),任务状态变 Completed | ☐ |
| TC-P3-36 | 任务持久化 | 接取任务 → 完成部分目标 → 存档 → 重载 | 任务进度正确恢复ObjectiveProgress 保存) | ☐ |
---
### 6.9 挑战房间
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-37 | 挑战房间触发 | 玩家进入 ChallengeRoomTrigger | 房间封锁(出口门关闭),`ChallengeRoomManager.StartChallenge(so)` 调用,限时计时器启动 | ☐ |
| TC-P3-38 | 挑战胜利 | 在时限内满足 `ChallengeRoomSO` 通关条件 | 出口门开启,奖励生成,`EVT_ChallengeCompleted` 广播 | ☐ |
| TC-P3-39 | 挑战失败 | 超时或玩家死亡 | 挑战失败流程触发,可重置 | ☐ |
---
### 6.10 地图模块
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-40 | 房间探索记录 | 进入新房间 | `SaveData.Map.ExploredRooms` 添加该房间 ID迷雾Fog of War在 MapPanel 中对应区域揭开 | ☐ |
| TC-P3-41 | 传送点图标 | 存档点被激活后 | MapPanel 上对应位置显示传送点图标 | ☐ |
| TC-P3-42 | 地图面板开关 | 按地图键(默认 Tab | MapPanel 开/关,全屏 Fog of War 渲染,已探索区域可见 | ☐ |
---
### 6.11 商店系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P3-43 | 商店面板打开 | 与 ShopKeeper NPC 交互 | ShopPanel 打开,显示 `ShopInventorySO` 中的商品列表及价格 | ☐ |
| TC-P3-44 | 购买道具 | 选择商品点击购买Geo 足够 | Geo 扣减,道具加入背包,`SaveData` 同步更新 | ☐ |
| TC-P3-45 | Geo 不足拒绝 | 选择商品点击购买Geo 不足 | 购买失败,提示"Geo 不足",无扣减 | ☐ |
---
## 7. P4 内容与完善
### 7.1 Boss 技能系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P4-01 | BossSkillExecutor 技能执行 | Boss 行为树调用 `BossSkillExecutor.ExecuteSkill(so)` | 技能协程启动,`IsExecuting = true`,攻击图案按 `AttackPatternSO` 时序逐步激活 HitBox | ☐ |
| TC-P4-02 | 技能中断 | 技能执行中切换阶段触发 `InterruptCurrentSkill()` | `StopCoroutine` 被调用,`IsExecuting` 重置为 false无挂起协程 | ☐ |
| TC-P4-03 | WFS 缓存零 GC | BossSkillExecutor 协程执行Profiler 录制) | `Profiler → GC Alloc` 在协程帧无新 `WaitForSeconds` 分配,静态缓存生效 | ☐ |
| TC-P4-04 | 弱点窗口开启 | `VulnerabilityWindow` 触发条件满足(如弹反成功) | `WeakPointSystem.SetActive(true, multiplier)` 调用,`EVT_VulnerabilityWindowOpened` 广播,弱点 HurtBox 可受击(伤害乘数生效) | ☐ |
| TC-P4-05 | TelegraphSystem 预警 VFX | BD_TelegraphAttack Task 执行 | 预警 VFX 从对象池生成,持续 `_duration` 秒后自动归还(`PooledObject.ReturnToPool` | ☐ |
| TC-P4-06 | BD_EnterPhase 阶段切换 | BD 行为树执行 BD_EnterPhase Task | `BossBase.EnterPhase(phaseIndex)` 调用,`EVT_BossPhaseChanged` 广播Boss 进入新阶段行为 | ☐ |
| TC-P4-07 | SkillSequenceSO 连段 | Boss 执行含 SkillSequenceSO 的技能 | `SequenceStep[]``delayBeforeStep` 间隔依次执行,`RepeatIfPlayerInRange` 逻辑生效 | ☐ |
| TC-P4-08 | BossResourceConfigSO 满值触发 | Boss 愤怒值积累到 `maxValue` | `autoTriggerOnFull = true` 时自动执行 `fullTriggerSkill`,触发后 `resetValueAfterTrigger` 重置资源值 | ☐ |
---
### 7.2 对话与叙事模块
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P4-09 | 对话启动 | 与 InteractableNPC 交互 | DialoguePanel 开启,打字机效果逐字显示文本,`InputReaderSO.EnableUIInput()` 自动切换 | ☐ |
| TC-P4-10 | 对话快进 | 对话中按确认键 | 当前对话行完整显示(跳过打字机),再按则跳到下一行 | ☐ |
| TC-P4-11 | 分支选择 | 对话出现选项节点 | 选项 UI 列表显示,导航键选择,确认后走对应分支 | ☐ |
| TC-P4-12 | 对话结束恢复 | 对话播完最后一行 | DialoguePanel 关闭,`InputReaderSO.EnableGameplayInput()` 恢复游戏输入 | ☐ |
| TC-P4-13 | NPC 任务绑定 | QuestGiver NPC 对话结束触发任务 | `QuestGiver.TryTriggerQuest()` 调用,任务接取(见 TC-P3-33 | ☐ |
---
### 7.3 事件链与过场
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P4-14 | EventChain 顺序执行 | 触发 EventChainSO | 链条中各步骤按序执行(延迟/对话/VFX/音效),最后一步完成后 `OnChainCompleted` 回调 | ☐ |
| TC-P4-15 | CutsceneManager Timeline | 触发过场 | Unity Timeline 播放,玩家输入锁定,过场结束后输入恢复 | ☐ |
---
### 7.4 UI 完整面板
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P4-16 | PausePanel 暂停 | 按 Esc | 游戏暂停(`Time.timeScale = 0`PausePanel 显示,继续/存档/退出按钮可用 | ☐ |
| TC-P4-17 | InventoryPanel 背包 | 打开背包 | 已持有护符/工具列表显示,装备/卸除操作生效(见 TC-P3-25/26 | ☐ |
| TC-P4-18 | SettingsPanel 设置 | 打开设置 | 音量/分辨率/按键重绑定选项显示,修改后实时生效 | ☐ |
| TC-P4-19 | AchievementPanel 成就 | 打开成就面板 | 已解锁成就高亮,未解锁为灰,进度条正确(如护符收集比例) | ☐ |
---
### 7.5 按键重绑定
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P4-20 | 重绑定操作 | 打开 SettingsPanel → 按键重绑定 → 点击攻击键 → 按新键 | 新键绑定生效,旧键不再触发攻击,绑定信息写入 PlayerPrefs | ☐ |
| TC-P4-21 | 绑定冲突检测 | 尝试将攻击键绑定为已被跳跃键占用的按键 | 提示冲突(或自动交换),不出现双动作绑定同一键 | ☐ |
| TC-P4-22 | 重置默认绑定 | 点击"恢复默认"按钮 | 所有绑定恢复出厂设置 | ☐ |
---
### 7.6 本地化系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P4-23 | 语言切换 | 在 SettingsPanel 切换语言(简体中文/English | 所有 `LocalizedText` 组件立即更新为目标语言,无"Missing Key"占位符 | ☐ |
| TC-P4-24 | 语言持久化 | 切换语言 → 退出 Play Mode → 再次 Enter | 语言设置保留 | ☐ |
---
### 7.7 成就系统
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P4-25 | NailClashCountCondition | 触发 5 次 NailClash 弹反碰撞 | `Stats.SkillUseCounts["NailClash"] >= 5`,成就解锁,`EVT_AchievementUnlocked` 广播 | ☐ |
| TC-P4-26 | MapExplorationCondition | 探索达到 `requiredRoomCount` 个房间 | 成就解锁AchievementPanel 对应项高亮 | ☐ |
| TC-P4-27 | UnlockedAllAbilitiesCondition | 解锁 `requiredAbilities` 中所有能力 | 位掩码检查通过,成就解锁 | ☐ |
| TC-P4-28 | 成就进度显示 | 部分完成 CollectedAllCharmsCondition | `GetProgress()` 返回 `owned / totalCharmsCount`AchievementPanel 进度条正确 | ☐ |
---
### 7.8 平台支撑Steam / 存档云同步)
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P4-29 | PlatformBootstrap 初始化 | Play Mode非编辑器模式或 Dev Build | Steam SDK 初始化Console 无 `Steamworks.NET` 错误),不崩溃 | ☐ |
| TC-P4-30 | Steam 成就上报 | 满足成就条件后 | `SteamUserStats.SetAchievement()` 被调用(通过 Steam SDK 日志验证Steamworks 未初始化时本地静默降级 | ☐ |
---
### 7.9 支撑模块(调试 / 无卡点 / 无障碍 / 速通)
| TC-ID | 测试项 | 操作步骤 | 期望结果 | ☐ |
|-------|-------|---------|---------|---|
| TC-P4-31 | DebugCheatSystem 作弊 | Development Build / Editor输入作弊码如全体 HP 回满) | 作弊生效Console 输出 `[Cheat] HP restored`Release Build 中指令无效 | ☐ |
| TC-P4-32 | AntiSoftlockSystem 出门触发 | 玩家在封闭区域卡住超过 `stuckTimeout` | AntiSoftlock 弹出选项("是否返回最近存档点"),选是则安全返回 | ☐ |
| TC-P4-33 | AccessibilityManager 色盲模式 | 设置开启 Color Blind 模式 | `PaletteSwapSystem` 切换色盲调色板VFX 颜色对比度提升 | ☐ |
| TC-P4-34 | AccessibilityManager 震动开关 | 关闭震动 | `NiceVibrations` 调用不触发(`MMVibrationManager` 在 disabled 时静默) | ☐ |
| TC-P4-35 | SpeedrunTimer IGT 计时 | Play Mode 进入游戏 | SpeedrunTimer 从 0 开始计时暂停时停止IGT 不含暂停),存档保存 `ElapsedTime` | ☐ |
| TC-P4-36 | AnalyticsManager 本地日志 | 触发若干游戏事件(死亡/存档/能力解锁) | `Analytics/session_{date}.jsonl` 文件在磁盘生成,包含对应事件条目 | ☐ |
---
## 8. 全流程端到端验证
以下场景模拟完整游戏会话,覆盖跨系统协同:
### E2E-01新游戏完整启动流程
**步骤**
1. 删除所有存档文件(`Application.persistentDataPath/saves/`
2. Enter Play Mode进入主菜单
3. 选择"新游戏",确认选择难度
4. 场景加载完成,玩家出现在起始房间
5. 观察 Console 和 Profiler
**期望结果**
- 无 ErrorPersistent 场景 + 游戏场景同时加载
- ServiceLocator 注册日志正确7 个核心服务全部注册)
- HUD 正确初始化HP 满Geo=0形态 = Sky
- 输入立即响应
- GC Alloc 在启动后 3 秒内趋近 0Profiler 确认)
---
### E2E-02完整战斗至死亡复活流
**步骤**
1. 与 SavePoint 交互存档
2. 进入带 LootTableSO 的普通敌人房间
3. 使用 3 段连击击败敌人
4. 拾取掉落 Geo
5. 进入第二波(含远程敌人),故意让玩家死亡
6. 死亡屏幕出现,等待复活
**期望结果**
- 连击判定正确HitBox 时序准确,无穿透)
- Geo 正确累加HUD 同步)
- 远程敌人弹射物从对象池生成,无 `Instantiate` 调用Profiler 对象池)
- 死亡DeadState 冻结物理,`EVT_PlayerDied` 广播
- DeathShade 在死亡位置生成,含本次积累的 Geo
- 复活在上次存档点HP 满Geo = 0未回收 DeathShade 则 Geo 不恢复)
---
### E2E-03多房间探索 + 传送 + 存档完整性
**步骤**
1. 起始房间探索,地图揭开
2. 通过 RoomTransition 进入第二房间(带 Loading Screen
3. 第二房间激活 AbilityGate → 发现需要冲刺能力
4. 找到 AbilityUnlock 触发区,解锁冲刺
5. AbilityGate 自动开启,通过
6. 与 SavePoint 交互存档
7. Exit Play Mode → Enter Play Mode → 加载存档
**期望结果**
- 每步无 Error
- 地图探索记录(`ExploredRooms`)在两个房间均有记录
- 冲刺能力解锁后 AbilityGate 实时响应(无需重进场景)
- 存档重载后:位置=SavePoint 坐标,冲刺能力=已解锁,地图探索=保留Geo=已保存值
---
### E2E-04Boss 完整战斗流
**步骤**
1. 进入 Boss 房间,触发 Boss Arena 锁定
2. 观察 Boss 第一阶段行为树(巡逻→预警→攻击→技能连段)
3. HP 降至 50%Boss 进入第二阶段
4. 成功弹反 Boss 攻击,触发弱点窗口
5. 对弱点集中攻击
6. Boss HP 归零,死亡
**期望结果**
- BD_IsPlayerVisible 读取 BatchLOSSystem 缓存(无每帧 Raycast
- 阶段切换:`EVT_BossPhaseChanged` 广播UI Boss HP 条颜色变化
- 弹反成功:弱点 HurtBox 激活,伤害乘数生效,`EVT_VulnerabilityWindowOpened` 广播
- TelegraphSystem VFX 从对象池生成归还,无残留
- Boss 死亡:`EVT_BossFightEnded` 广播Arena 解锁,战利品生成
---
### E2E-05成就全流程
**步骤**
1. 累计触发 5 次 NailClash弹反碰撞检测
2. 探索 `requiredRoomCount` 个房间
3. 打开 AchievementPanel
**期望结果**
- NailClash 计数通过 `SaveData.Stats.SkillUseCounts["NailClash"]` 存档
- 房间探索通过 `SaveData.Map.ExploredRooms` 存档
- AchievementPanel 对应成就解锁高亮,进度条准确
- Steam 成就上报(若在 Dev Build 模式)
---
## 9. 验收通过标准
### 必须全部通过(阻断级)
- ENV-0107 全通过0 编译错误)
- TC-P0-01 TC-P0-05基础设施可运行
- TC-P1-01 TC-P1-08最小可玩流程
- E2E-01新游戏启动无 Error
- E2E-02战斗至死亡复活完整流程
### 核心功能通过(发布前必须通过)
- P2 系列TC-P2-01 TC-P2-45核心玩法全覆盖
- P3 系列TC-P3-01 TC-P3-45世界互动全覆盖
- E2E-03多房间探索存档完整性
- E2E-04Boss 完整战斗流)
### 支撑功能通过(发布质量)
- P4 系列TC-P4-01 TC-P4-36内容与完善全覆盖
- E2E-05成就全流程
### 性能基准Profile 验证)
| 指标 | 基准值 | 验证方法 |
|------|--------|---------|
| 战斗帧率(单房间 + 3 敌人) | ≥ 60 FPSMobile≥ 30 | Profiler CPU Usage |
| 战斗中帧 GC Alloc | ≤ 0 B/帧(稳定运行后) | Profiler GC Alloc Track |
| 内存增量10 分钟游戏) | ≤ 5 MB对象池正常回收 | Profiler Memory Profiler |
| 场景加载时间(带 Loading Screen | ≤ 2 秒(含 Addressables 异步) | `Stopwatch` / SceneLoader 日志 |
---
## 10. 缺陷登记表
> 测试过程中发现的缺陷记录于此,格式与代码评审 TD 编号体系对齐(使用 BUG- 前缀区分)。
| BUG-ID | 严重程度 | 发现于 | 复现 TC | 描述 | 状态 | 修复版本 |
|--------|---------|-------|---------|------|------|---------|
| *(示例)* BUG-01 | 高 | E2E-02 | TC-P2-17 | HitBox 在 Attack3 后未 Deactivate造成持续判定 | ⏳ 待修复 | — |
---
*文档维护:每次 Phase 验收后更新「阶段验收状态总览」及「缺陷登记表」新增测试用例按模块追加TC-ID 自增。*