Files
zeling_v2/Docs/Verification/AcceptanceTest_All_Phases.md

598 lines
36 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 自增。*