Files
zeling_v2/Docs/Verification/10_Manual_ProgressionSystem.md

327 lines
12 KiB
Markdown
Raw 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.
# 手动测试 10 · 进程与养成系统
> **测试类型**Unity Editor 手动测试Play Mode
> **覆盖模块**`BaseGames.Skills`、`BaseGames.Equipment`、`BaseGames.Quest`、`BaseGames.Progression`、`BaseGames.World.Shop`
> **依赖组件**`SkillManager`、`EquipmentManager`、`QuestManager`、`AchievementManager`、`ShopKeeper`
> **场景要求**:含存档点、商店 NPC、任务触发器的完整测试场景
---
## 快速工具
| 工具 | 用途 | 菜单路径 |
|------|------|----------|
| **Validate All ScriptableObjects** | 遍历所有实现 `IValidatable` 的 SO输出验证结果含 SkillTreeSO、QuestDatabaseSO 等) | `BaseGames → Tools → Validate All ScriptableObjects` |
> **注意**PlayModeDebugOverlay 已移除。Geo 注入、技能点测试等请通过 Inspector 直接修改对应 Manager 字段,或临时编写 Editor 脚本触发。
> Tab 10 的场景摆放工具Add Quest Trigger、Add Shop NPC已不再提供请参照下方各节**手动步骤**手工创建对应对象。
**典型工作流**
1. 测试前:`BaseGames → Tools → Validate All ScriptableObjects` 一键确认 SO 存在若有缺失Console 给出路径提示。
2. `MT-PROG-01` 技能:进入 Play Mode通过 Inspector 直接修改 `SkillManager._skillPoints` 字段,在技能树 UI 解锁目标技能。
3. `MT-PROG-03` 任务:手动放置 `QuestGiver` NPC见下方步骤`QuestSO` 拖入 InspectorPlay Mode 中交互验证。
4. `MT-PROG-05` 商店:手动放置 `ShopNPC`(见下方步骤),通过 Inspector 修改 `_geo` 字段给玩家加钱,交互购买。
---
## 目录
1. [前置数据检查](#1-前置数据检查)
2. [MT-PROG-01技能解锁与使用](#mt-prog-01技能解锁与使用)
3. [MT-PROG-02装备系统护符/武器)](#mt-prog-02装备系统护符武器)
4. [MT-PROG-03任务系统QuestManager](#mt-prog-03任务系统questmanager)
5. [MT-PROG-04成就系统AchievementManager](#mt-prog-04成就系统achievementmanager)
6. [MT-PROG-05商店系统Shop](#mt-prog-05商店系统shop)
7. [MT-PROG-06能力解锁AbilityUnlock](#mt-prog-06能力解锁abilityunlock)
---
## 1. 前置数据检查
| 资产 | 路径(示例) | 必要性 | ✓ |
|------|------------|--------|---|
| SkillTreeSO | `Assets/Data/Skills/SkillTree.asset` | 技能测试必须 | ☐ |
| EquipmentSlotConfigSO | `Assets/Data/Equipment/SlotConfig.asset` | 装备测试必须 | ☐ |
| QuestDatabaseSO | `Assets/Data/Quests/` | 任务测试必须 | ☐ |
| AchievementDatabaseSO | `Assets/Data/Achievements/` | 成就测试必须 | ☐ |
| ShopInventorySO | `Assets/Data/Shop/` | 商店测试必须 | ☐ |
> **🔧 一键检查 + 资产创建**
>
> **步骤 1 — 验证资产存在性**
> 菜单 `BaseGames → Tools → Validate All ScriptableObjects`
> - Console 输出每项 ✅(通过)或 ❌(失败/未找到)
>
> **步骤 2 — 创建所有占位 SO**(若有缺失):
> 按照下方**步骤 3** 手动通过 Project 右键菜单创建对应资产。
>
> **步骤 3 — 创建尚未覆盖的数据资产(手动)**
>
> | 资产 | 创建方法 |
> |------|----------|
> | `SkillTreeSO` | Project 右键 → Create → BaseGames → Skills → Skill Tree保存到 `Assets/_Game/Data/Skills/` |
> | `EquipmentSlotConfigSO` | Project 右键 → Create → BaseGames → Equipment → Slot Config保存到 `Assets/_Game/Data/Equipment/` |
> | `QuestDatabaseSO` | Project 右键 → Create → BaseGames → Quest → Quest Database保存到 `Assets/_Game/Data/Quests/` |
> | `AchievementDatabaseSO` | Project 右键 → Create → BaseGames → Progression → Achievement Database保存到 `Assets/_Game/Data/Achievements/` |
> | `ShopInventorySO` | 已由 Create Test Assets 创建为 `ShopInventory_Test.asset`;点 Inspector 的 `+` 按钮添加 `ShopItem` 条目 |
>
> **步骤 4 — 绑定 Manager 字段**Play Mode 前):
> - 找到 `SkillManager` GameObject → Inspector → `_skillTree` 字段拖入 `SkillTree.asset`
> - 找到 `ShopNPC` GameObjectTab 10 → 添加商店 NPC→ `_inventory` 字段拖入 `ShopInventory_Test.asset`
---
## MT-PROG-01技能解锁与使用
**目的**:验证 `SkillManager` 的技能解锁、技能使用、冷却管理、MP 消耗。
> **🔧 资源准备**
> 1. 确认 `SkillTree.asset` 已绑定到 `SkillManager._skillTree` 字段
> 2. 在 Inspector 中直接将 `SkillManager._skillPoints` 设为 5Play Mode 下修改字段值)快速获取技能点(跳过进程解锁流程)
> 3. 若 `SkillManager` 不在场景中,手动在空 GameObject 上挂载 `SkillManager` 组件并绑定 `SkillTree.asset`
### 步骤
**步骤 A技能解锁**
1. 打开技能树 UI默认 P 键)
2. 确认有足够的技能点(`SkillPoints > 0`
3. 点击未解锁的技能节点,确认解锁
**预期**
- 技能节点视觉变为已解锁状态
- `SkillPoints - skillCost`
- `SkillManager.IsUnlocked(skillId) == true`
- 技能快捷键绑定生效
**步骤 B技能使用主动技能**
1. 进入 Play Mode 战斗场景
2. 按已绑定技能快捷键(如 1/2/3 或 Q/E/R
**预期**
- 技能动画播放(`AnimancerComponent` 播放技能动画片段)
- MP 消耗(`CurrentMP -= mpCost`
- 技能效果触发(伤害、范围、特效)
- 进入冷却(`cooldown` 秒内无法再次使用)
**步骤 CMP 不足时**
1. 使 `CurrentMP < skill.mpCost`
2. 按技能键
**预期**技能无法释放UI 技能图标显示 MP 不足提示(灰色)。
**步骤 D技能冷却**
1. 使用技能后立即再次按技能键
**预期**冷却期内不触发UI 冷却进度条显示。
| 检查点 | 期望 | ✓ |
|--------|------|---|
| 解锁技能 | 技能节点标记已解锁SkillPoints 减少 | ☐ |
| 技能释放 | 动画播放效果触发MP 扣减 | ☐ |
| MP 不足 | 无法释放UI 提示 | ☐ |
| 冷却 | 冷却期无法再次使用,进度条显示 | ☐ |
---
## MT-PROG-02装备系统护符/武器)
**目的**:验证 `EquipmentManager` 护符槽管理、装备属性叠加、超出槽数无法装备。
### 步骤
**步骤 A装备护符**
1. 打开装备 UI默认 Tab 键或 E 键进入背包)
2. 拖拽/确认护符到空槽位
**预期**
- 护符装备成功,护符图标显示在槽位
- 护符效果立即生效(如 HP+20查看 `PlayerStats.MaxHP`
- `EquipmentManager.IsEquipped(amuletId) == true`
**步骤 B槽位已满**
1. 将所有护符槽填满(`maxAmuletSlots` 个护符)
2. 尝试装备第 `maxAmuletSlots + 1` 个护符
**预期**:系统提示"护符栏已满",无法装备(不会覆盖现有护符)。
**步骤 C卸下护符**
1. 选中已装备的护符,点击"卸下"
**预期**
- 护符移回背包
- 护符提供的属性加成撤销HP 恢复原值)
**步骤 D武器切换FormController 联动)**
1. 切换形态Sky/Earth/Death
**预期**:装备的武器 SO 根据形态切换,攻击力/攻击动画随形态变化。
| 检查点 | 期望 | ✓ |
|--------|------|---|
| 装备护符 | 效果立即生效,图标显示 | ☐ |
| 槽位限制 | 超出槽数无法装备 | ☐ |
| 卸下护符 | 属性加成撤销 | ☐ |
| 形态武器 | 不同形态武器属性不同 | ☐ |
---
## MT-PROG-03任务系统QuestManager
**目的**:验证 `QuestManager` 的任务激活→进度追踪→完成→奖励全流程。
> **🔧 资源准备**
> 1. 在 **Tab 10 → `添加任务触发器QuestTrigger`** 一键放置 `QuestTrigger` GameObject含 CapsuleCollider2D
> 2. 在 Inspector 中将 `QuestTriggerSO`手动创建Project 右键 → Create → BaseGames → Quest → QuestSO拖入 `QuestTrigger._questToStart`
> 3. 确认 `QuestDatabaseSO` 中已注册该 QuestSO 条目
### 步骤
**步骤 A任务激活**
1. 找到场景中的任务触发器(如 NPC 对话后触发任务)或手动调用 `QuestManager.StartQuest(questId)`
2. 打开任务日志 UI
**预期**:任务出现在"进行中"列表,任务目标文本正确显示。
**步骤 B进度追踪**
1. 完成部分任务目标(如击杀 X 敌人/收集 X 物品)
2. 查看任务日志
**预期**:任务进度更新(如 "击杀 2/5 只敌人"`EVT_QuestProgressUpdated` 事件触发。
**步骤 C任务完成**
1. 完成所有任务目标
**预期**
- `EVT_QuestCompleted` 事件触发
- 任务移入"已完成"列表
- 奖励自动发放Geo/技能点/道具)
- 存档文件中 `SaveData.Quests[questId].IsCompleted == true`
| 检查点 | 期望 | ✓ |
|--------|------|---|
| 任务激活 | 任务出现在进行中列表 | ☐ |
| 进度追踪 | 完成目标后进度数字更新 | ☐ |
| 完成奖励 | 奖励正确发放 | ☐ |
| 持久化 | 存档中 IsCompleted == true | ☐ |
---
## MT-PROG-04成就系统AchievementManager
**目的**:验证 `AchievementManager` 触发条件监听、达成弹窗、持久化。
### 步骤
1. 触发某个成就的条件(如"首次击杀 Boss"、"连续弹反 5 次"等)
**预期**
- 屏幕右上角弹出成就解锁通知(`AchievementPopup`
- 通知显示成就名称和图标
- `EVT_AchievementUnlocked` 触发
2. 打开成就列表 UI
**预期**:该成就显示为已解锁状态(金色)。
3. 退出并重新进入 Play Mode
**预期**:成就状态仍为已解锁(`SaveData.Achievements` 持久化)。
| 检查点 | 期望 | ✓ |
|--------|------|---|
| 触发弹窗 | 条件达成后弹出通知 | ☐ |
| 列表状态 | 成就列表中显示已解锁 | ☐ |
| 持久化 | 重进后仍为已解锁 | ☐ |
---
## MT-PROG-05商店系统Shop
**目的**:验证 `ShopKeeper`/`ShopInventory` 的购买/售出流程、Geo 扣减、背包更新。
> **🔧 资源准备**
> 1. 手动在场景中创建 `ShopNPC` GameObject添加 `CapsuleCollider2D`,并挂载 `ShopNPC` 组件
> 2. 在 Inspector 中将 `ShopInventory_Test.asset` 拖入 `ShopNPC._inventory`
> 3. 打开 `ShopInventory_Test.asset`,在 Inspector 展开 `_items` 数组,添加几个 `ShopItem`(配置 itemId、price、count
> 4. Play Mode 中在 Inspector 直接将 `PlayerController` / `GeoManager._geoCount` 设为 500 快速获取购物用 Geo
### 步骤
**步骤 A打开商店**
1. 走到商店 NPC按交互键
**预期**:商店 UI 打开,显示 `ShopInventorySO` 中的物品列表(价格、图标、名称)。
**步骤 B购买物品**
1. 选择一个 Geo 充足的物品,确认购买
**预期**
- `CurrentGeo -= item.price`
- 物品出现在背包
- HUD Geo 数量更新
**步骤 CGeo 不足**
1. 选择价格超过当前 Geo 的物品
**预期**:购买失败,提示"Geo 不足"Geo 不变。
**步骤 D售出物品**
1. 在商店卖出背包中的物品
**预期**
- `CurrentGeo += item.sellPrice`
- 物品从背包移除
- HUD Geo 数量更新
| 检查点 | 期望 | ✓ |
|--------|------|---|
| 商店 UI 打开 | 物品列表正确显示 | ☐ |
| 购买成功 | Geo 减少,物品进背包 | ☐ |
| Geo 不足 | 购买失败Geo 不变 | ☐ |
| 售出 | Geo 增加,物品移除 | ☐ |
---
## MT-PROG-06能力解锁AbilityUnlock
**目的**验证特殊能力DoubleJump、WallSlide、Dash 等)的解锁与 `AbilityGate` 联动。
### 步骤
1. 确认某能力(如 DoubleJump当前**未解锁**
2. 找到对应的能力解锁点Boss 击败后掉落,或特定区域触发)
3. 触发解锁
**预期**
- `EVT_AbilityUnlocked(abilityId)` 触发
- `SkillManager.HasAbility(abilityId) == true`
- 存档中 `SaveData.Abilities` 包含该 abilityId
- 对应 `AbilityGate` 自动开启(若当前场景有联动门)
4. 测试新解锁的能力(如 DoubleJump跳跃后再次跳跃
**预期**:能力生效(二段跳可用)。
| 检查点 | 期望 | ✓ |
|--------|------|---|
| 解锁事件 | EVT_AbilityUnlocked 触发 | ☐ |
| HasAbility == true | SkillManager 返回 true | ☐ |
| AbilityGate 开启 | 对应能力门自动开启 | ☐ |
| 能力可用 | 新能力实际可使用 | ☐ |
| 持久化 | 存档中有该 abilityId | ☐ |