将 10_Manual_ProgressionSystem.md 中不存在的 SkillTreeSO/技能点/技能树解锁 流程,改写为真实实现:技能(FormSkillSO)随形态由 FormController 注入 SkillManager, 施放消耗魂力/灵力;能力通过 AbilityType 位掩码解锁(PlayerStats/AbilityFlags)。 同步更正 MT-PROG-06 的 HasAbility/存档字段引用,并统一 05/07/11 文档措辞为 '形态技能一览(FormSkillPanel)',明确本项目无技能树。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
365 lines
14 KiB
Markdown
365 lines
14 KiB
Markdown
# 手动测试 11 · UI、音频与特效系统
|
||
|
||
> **测试类型**:Unity Editor 手动测试(Play Mode)
|
||
> **覆盖模块**:`BaseGames.UI`、`BaseGames.Audio`、`BaseGames.VFX`、`BaseGames.Feedback`、`BaseGames.Localization`
|
||
> **依赖组件**:`HUDController`、`AudioManager`、`VFXCatalogSO`、`MMF_Player`(Feel)、`LocalizationManager`
|
||
> **场景要求**:含完整 HUD Canvas、AudioMixer,Feel 的 MMF_Player 绑定到角色
|
||
|
||
---
|
||
|
||
## 快速工具
|
||
|
||
| 工具 | 用途 | 菜单路径 |
|
||
|------|------|----------|
|
||
| **Validate All ScriptableObjects** | 遍历所有实现 `IValidatable` 的 SO,输出 ✅/❌ 报告(含 HUDController 频道字段、VFXCatalogSO 等) | `BaseGames → Tools → Validate All ScriptableObjects` |
|
||
|
||
> **注意**:PlayModeDebugOverlay 已移除。HUD 变化测试请通过 Inspector 直接修改对应 Manager 字段(HP、Geo 等),或配置带伤害的敌人触发真实战斗流程。
|
||
> Tab 11 的 Validate HUD Bindings、Ensure AudioMixer、Validate VFX Catalog 等独立检查已合并到 `Validate All ScriptableObjects`,如需单独检查各 SO 字段请在 Console 过滤对应日志。
|
||
|
||
**典型工作流**:
|
||
1. 测试前:`BaseGames → Tools → Validate All ScriptableObjects` 确认 HUD 频道全部绑定、VFX Catalog 无空引用;AudioMixer 检查参照下方 **MT-UI-03** 手动步骤。
|
||
2. `MT-UI-01` HUD 绑定:Inspector 中直接修改 `PlayerStats._hp` 字段,观察 HP 条平滑动画。
|
||
3. `MT-UI-04` VFX:配置带燃烧效果的敌人攻击玩家,Scene 视图观察 VFX Prefab 实例化。
|
||
4. `MT-UI-05` Feel 反馈:配置敌人打玩家触发受击,观察 Camera Shake 和 Chromatic Aberration。
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
1. [HUD 与 UI 前置检查](#1-hud-与-ui-前置检查)
|
||
2. [MT-UI-01:HUD 实时数据绑定](#mt-ui-01hud-实时数据绑定)
|
||
3. [MT-UI-02:UI 面板管理(PanelManager)](#mt-ui-02ui-面板管理panelmanager)
|
||
4. [MT-UI-03:AudioManager 混音器快照](#mt-ui-03audiomanager-混音器快照)
|
||
5. [MT-UI-04:VFX 目录(VFXCatalogSO)](#mt-ui-04vfx-目录vfxcatalogso)
|
||
6. [MT-UI-05:Feel 反馈链(MMF_Player)](#mt-ui-05feel-反馈链mmf_player)
|
||
7. [MT-UI-06:本地化(Localization)](#mt-ui-06本地化localization)
|
||
8. [MT-UI-07:对话系统(DialogueSystem)](#mt-ui-07对话系统dialoguesystem)
|
||
|
||
---
|
||
|
||
## 1. HUD 与 UI 前置检查
|
||
|
||
| 元素 | 说明 | ✓ |
|
||
|------|------|---|
|
||
| HUDController | Canvas 下有 `HUDController.cs`,绑定 HP/MP/Geo/Spring 事件频道 | ☐ |
|
||
| AudioMixer | `Assets/Settings/MainMixer.mixer` 已创建,含 Master/Music/SFX/UI 子轨道 | ☐ |
|
||
| VFXCatalogSO | `Assets/Data/VFX/VFXCatalog.asset` 已配置并引用正确 VFX Prefab | ☐ |
|
||
| Feel MMF_Player | 角色 Prefab 上 `PlayerFeedbacks` 组件已绑定 | ☐ |
|
||
|
||
> **🔧 前置资产创建指导**
|
||
>
|
||
> **① HUD Canvas 创建(若尚无 Canvas)**:
|
||
> 1. Hierarchy 右键 → **UI → Canvas**,命名 `HUD_Canvas`
|
||
> 2. 在 `HUD_Canvas` 下添加 `HUDController` 组件
|
||
> 3. 运行 `BaseGames → Tools → Validate All ScriptableObjects`,根据 Console ❌ 提示,将以下频道 SO 拖入对应字段:
|
||
> - `_onHPChanged` → `EVT_HPChanged`(IntEventChannelSO)
|
||
> - `_onMaxHPChanged` → `EVT_MaxHPChanged`(IntEventChannelSO)
|
||
> - `_onSoulPowerChanged` → `EVT_SoulPowerChanged`(IntEventChannelSO)
|
||
> - `_onSpiritPowerChanged` → `EVT_SpiritPowerChanged`(IntEventChannelSO)
|
||
> - `_onGeoChanged` → `EVT_GeoChanged`(IntEventChannelSO)
|
||
> - `_onSpringChargesChanged` → `EVT_SpringChargesChanged`(IntEventChannelSO)
|
||
>
|
||
> 若 SO 资产不存在,先运行菜单 `BaseGames → Tools → Create Event Channel Assets` 生成全部频道资产
|
||
>
|
||
> **② AudioMixer 创建(无法脚本化,仅可手动)**:
|
||
> 1. Project 右键 → **Create → Audio Mixer** → 命名 `MainMixer` → 保存到 `Assets/_Game/Settings/`
|
||
> 2. 在 Mixer 窗口(Window → Audio → Audio Mixer)中选中 `Master`,点 **+** 按钮创建三个子组 `Music`、`SFX`、`UI`
|
||
> 3. 将 `MainMixer` 资产拖入 `AudioManager._mixer` 字段
|
||
>
|
||
> **③ VFXCatalogSO 条目填写**:
|
||
> 1. 运行 `BaseGames → Tools → Validate All ScriptableObjects` 查看空引用条目
|
||
> 2. 在 Project 视图找到 `VFXCatalog.asset`,展开 `_entries` 数组,将制作好的 VFX Prefab 拖入每条的 `prefab` 字段
|
||
> 3. ⚠ VFX Prefab 本身需手动制作(ParticleSystem),无法自动生成
|
||
|
||
---
|
||
|
||
## MT-UI-01:HUD 实时数据绑定
|
||
|
||
**目的**:验证 HP/MP/Geo/灵泉 HUD 元素实时响应游戏状态变化。
|
||
|
||
> **🔧 资源准备(驱动 HUD 数据变化)**
|
||
>
|
||
> 进入 Play Mode 后,通过 Inspector 直接修改 `PlayerStats._hp` / `_geo` 等字段,观察对应 HUD 元素响应:
|
||
> - **HP 变化** — 修改 `PlayerStats._hp`,观察 HP 条减少 / 恢复动效
|
||
> - **Geo 变化** — 修改 `PlayerStats._geo`,观察 Geo 数字滚动
|
||
> - **灵泉变化** — 修改 `PlayerStats._springCharges`,观察图标变化
|
||
>
|
||
> 也可配置带伤害的敌人触发真实战斗流程。
|
||
|
||
### 步骤
|
||
|
||
**HP 条**:
|
||
|
||
1. 让玩家受到攻击(HP 减少)
|
||
|
||
**预期**:
|
||
- HP 条动画更新(平滑或直接减少,取决于设计)
|
||
- HP 条颜色/动效响应(HP 低时变红或闪烁)
|
||
|
||
**MP(灵力)条**:
|
||
|
||
1. 玩家释放技能消耗 MP
|
||
|
||
**预期**:MP 条立即减少;停止使用后 MP 逐步恢复(如有恢复机制)。
|
||
|
||
**Geo 计数器**:
|
||
|
||
1. 拾取 Geo 或购买物品
|
||
|
||
**预期**:Geo 数字动画更新(计数滚动动效)。
|
||
|
||
**灵泉图标**:
|
||
|
||
1. 使用治疗(灵泉 -1)
|
||
|
||
**预期**:灵泉图标减少一个(图标变暗或消失)。
|
||
|
||
| 检查点 | 期望 | ✓ |
|
||
|--------|------|---|
|
||
| HP 实时响应 | 受击后 HP 条即时更新 | ☐ |
|
||
| MP 实时响应 | 技能使用后 MP 条即时更新 | ☐ |
|
||
| Geo 数字更新 | 拾取/消费后 Geo 即时更新 | ☐ |
|
||
| 灵泉图标 | 使用后图标减少 | ☐ |
|
||
| 无 UI 错误 | Console 无 UI Null 或 Missing Reference | ☐ |
|
||
|
||
---
|
||
|
||
## MT-UI-02:UI 面板管理(PanelManager)
|
||
|
||
**目的**:验证多个 UI 面板(形态技能一览/装备/任务/暂停)的互斥打开和关闭逻辑。
|
||
|
||
### 步骤
|
||
|
||
1. 按形态技能一览快捷键(P)打开 `FormSkillPanel`
|
||
|
||
**预期**:形态技能一览面板打开,游戏暂停(`Time.timeScale = 0`)。
|
||
|
||
2. 按装备快捷键(Tab)(在形态技能一览面板开启的情况下)
|
||
|
||
**预期**:形态技能一览关闭,装备面板打开(面板互斥,不同时显示多个菜单面板)。
|
||
|
||
3. 按 ESC 键
|
||
|
||
**预期**:当前打开的任意面板关闭,游戏恢复(`Time.timeScale = 1`)。
|
||
|
||
4. 打开暂停菜单(ESC 键)
|
||
|
||
**预期**:暂停菜单显示,`EVT_GamePaused` 事件触发,其他 UI 面板不显示。
|
||
|
||
| 检查点 | 期望 | ✓ |
|
||
|--------|------|---|
|
||
| 面板互斥 | 同时只有一个主面板开启 | ☐ |
|
||
| ESC 关闭面板 | ESC 关闭当前面板 | ☐ |
|
||
| 暂停时 timeScale=0 | 面板打开时游戏暂停 | ☐ |
|
||
| 关闭后 timeScale=1 | 面板关闭后游戏恢复 | ☐ |
|
||
|
||
---
|
||
|
||
## MT-UI-03:AudioManager 混音器快照
|
||
|
||
**目的**:验证 `AudioManager` 在不同 GameState 下切换 AudioMixer 快照,正确控制音量。
|
||
|
||
> **🔧 资源准备(AudioMixer 必须手动创建)**
|
||
>
|
||
> 1. **手动创建步骤**:
|
||
> - Project 右键 → **Create → Audio Mixer** → 命名 `MainMixer` → 保存到 `Assets/_Game/Settings/`
|
||
> - 打开 Window → Audio → Audio Mixer
|
||
> - 选中 `Master` 轨道,点 `+` 添加子组:`Music`、`SFX`、`UI`
|
||
> - 展开 Snapshots,点 `+` 添加:`Gameplay`、`Pause`、`BossFight`(用于快照切换测试)
|
||
> - 将 `Gameplay` 设为默认快照(右键 → Set as Start Snapshot)
|
||
> 2. 将 `MainMixer` 拖入场景 `AudioManager._mixer` 字段
|
||
> 3. ⚠ Unity 不支持通过代码创建 AudioMixer 资产(Editor API 无此功能),必须手动完成
|
||
|
||
### 步骤
|
||
|
||
**步骤 A:游戏运行快照**
|
||
|
||
1. 正常 Gameplay 状态下,观察 `Window → Audio → AudioMixer`
|
||
|
||
**预期**:Master 轨道均衡,`Gameplay` 快照激活,BGM 正常播放。
|
||
|
||
**步骤 B:暂停快照**
|
||
|
||
1. 按 ESC 打开暂停菜单
|
||
|
||
**预期**:
|
||
- `Pause` 快照切换(BGM 音量降低或混响增强)
|
||
- SFX 暂停或降低音量
|
||
- 暂停菜单 BGM 或静音正确切换
|
||
|
||
**步骤 C:Boss 战快照**
|
||
|
||
1. 进入 Boss 战触发区域
|
||
|
||
**预期**:
|
||
- `BossFight` 快照激活
|
||
- Boss 战 BGM 淡入
|
||
- 普通 BGM 淡出
|
||
|
||
**步骤 D:音量设置持久化**
|
||
|
||
1. 打开设置菜单,调整 BGM 音量
|
||
2. 关闭游戏(退出 Play Mode)并重新进入
|
||
|
||
**预期**:BGM 音量设置被保存(`PlayerPrefs` 或 `SaveData.Settings.BGMVolume`)。
|
||
|
||
| 检查点 | 期望 | ✓ |
|
||
|--------|------|---|
|
||
| Gameplay BGM | 正常播放,音量正常 | ☐ |
|
||
| 暂停快照 | BGM 降低/混响变化 | ☐ |
|
||
| Boss BGM | Boss 战 BGM 正确切换 | ☐ |
|
||
| 音量持久化 | 重进后音量设置保留 | ☐ |
|
||
|
||
---
|
||
|
||
## MT-UI-04:VFX 目录(VFXCatalogSO)
|
||
|
||
**目的**:验证 `VFXCatalogSO` 在各种触发条件下正确播放对应 VFX Prefab(通过对象池)。
|
||
|
||
> **🔧 资源准备(VFXCatalogSO 条目填写)**
|
||
>
|
||
> 1. 运行 `BaseGames → Tools → Validate All ScriptableObjects`,Console 显示空引用条目
|
||
> 2. 找到 `VFXCatalog.asset`(自定义路径),在 Inspector 展开 `_entries`
|
||
> 3. 为每个条目填入对应的 VFX Prefab(ParticleSystem GameObject):
|
||
>
|
||
> | Key(示例) | 用途 | Prefab 路径(示例) |
|
||
> |------------|------|---------------------|
|
||
> | `hit_slash` | 斩击命中 | `Assets/_Game/VFX/Hit_Slash.prefab` |
|
||
> | `hit_blunt` | 钝击命中 | `Assets/_Game/VFX/Hit_Blunt.prefab` |
|
||
> | `parry_ring` | 弹反 | `Assets/_Game/VFX/Parry_Ring.prefab` |
|
||
> | `player_hurt` | 玩家受击 | `Assets/_Game/VFX/Player_Hurt.prefab` |
|
||
> | `player_death` | 玩家死亡 | `Assets/_Game/VFX/Player_Death.prefab` |
|
||
> | `heal_spring` | 灵泉治疗 | `Assets/_Game/VFX/Heal_Spring.prefab` |
|
||
> | `plunge_land` | 下劈落地 | `Assets/_Game/VFX/Plunge_Land.prefab` |
|
||
>
|
||
> ⚠ VFX Prefab 需手动制作(ParticleSystem + 自定义 Shader),无法自动生成。若当前测试阶段 Prefab 未就绪,可将占位 Cube/Sphere 临时拖入以验证调用链正常。
|
||
|
||
### 触发点验证列表
|
||
|
||
执行以下动作,观察对应 VFX 是否播放:
|
||
|
||
| 触发动作 | 预期 VFX | ✓ |
|
||
|---------|---------|---|
|
||
| 玩家攻击命中敌人(斩击) | 击中溅血特效(slash hit) | ☐ |
|
||
| 玩家攻击命中敌人(钝击) | 击中火花/尘土特效(blunt hit) | ☐ |
|
||
| 弹反成功 | 弹反光圈特效(parry ring) | ☐ |
|
||
| 玩家受击 | 受击白闪 + 短暂粒子 | ☐ |
|
||
| 玩家死亡 | 死亡消散特效 | ☐ |
|
||
| 灵泉治疗 | 治疗绿色粒子 | ☐ |
|
||
| 下劈反弹 | 落点尘土爆炸 | ☐ |
|
||
|
||
### 对象池验证
|
||
|
||
1. 在 Hierarchy 中找到 `VFXPoolRoot`(或 `ObjectPool` GameObject)
|
||
2. 执行大量攻击,观察 Hierarchy 的 VFX Pool 子对象
|
||
|
||
**预期**:VFX 对象被复用(`SetActive(false)` 后再 `SetActive(true)`),不会无限创建新对象。
|
||
|
||
| 检查点 | 期望 | ✓ |
|
||
|--------|------|---|
|
||
| 各 VFX 正确播放 | 对应触发点显示正确特效 | ☐ |
|
||
| 对象池复用 | 不重复创建新 GameObject | ☐ |
|
||
|
||
---
|
||
|
||
## MT-UI-05:Feel 反馈链(MMF_Player)
|
||
|
||
**目的**:验证 `MMF_Player`(MoreMountains Feel)相机抖动、控制器震动、屏幕冲击等反馈。
|
||
|
||
### 步骤
|
||
|
||
**相机抖动(Camera Shake)**:
|
||
|
||
1. 执行强力攻击(如下劈落地、受到 Boss 重击)
|
||
|
||
**预期**:相机产生震动效果(`CinemachineImpulseSource` 或 `MMWiggle` 驱动),震动强度与事件大小相符。
|
||
|
||
**控制器震动(Controller Vibration)**(如在 Windows 上使用 Xbox 手柄):
|
||
|
||
1. 受到攻击
|
||
|
||
**预期**:手柄发生震动(`MMNVibrate` 或 `NiceVibrations` 调用)。
|
||
|
||
**屏幕闪烁(Screen Flash)**:
|
||
|
||
1. 使用爆炸性技能或受到大伤害
|
||
|
||
**预期**:屏幕短暂白色或红色闪烁(`PostProcessing` 或 `Image` Overlay)。
|
||
|
||
| 检查点 | 期望 | ✓ |
|
||
|--------|------|---|
|
||
| 相机抖动 | 重攻击/落地时相机抖动 | ☐ |
|
||
| 控制器震动 | 受击时手柄震动(手柄测试) | ☐ |
|
||
| 屏幕闪烁 | 大伤害时屏幕闪烁 | ☐ |
|
||
|
||
---
|
||
|
||
## MT-UI-06:本地化(Localization)
|
||
|
||
**目的**:验证 `LocalizationManager` 切换语言后 UI 文本正确更新。
|
||
|
||
### 步骤
|
||
|
||
1. 在游戏设置中切换语言(如:中文 → 英文)
|
||
|
||
**预期**:
|
||
- HUD 中的提示文本变为英文
|
||
- 对话框文本变为英文
|
||
- 技能/物品名称变为英文
|
||
|
||
2. 再切换回中文
|
||
|
||
**预期**:所有文本恢复中文,无残留英文。
|
||
|
||
3. 观察是否存在文本溢出(UI 元素装不下翻译后更长的字符串)
|
||
|
||
**预期**:UI 文本框自适应或截断处理正确,无文字超出边界。
|
||
|
||
| 检查点 | 期望 | ✓ |
|
||
|--------|------|---|
|
||
| 语言切换 | UI 文本全部更新 | ☐ |
|
||
| 切换回中文 | 无残留英文 | ☐ |
|
||
| 文本不溢出 | UI 无字符超出边界 | ☐ |
|
||
| 缺失 Key 检测 | Console 无 `Missing Localization Key` 警告 | ☐ |
|
||
|
||
---
|
||
|
||
## MT-UI-07:对话系统(DialogueSystem)
|
||
|
||
**目的**:验证 `DialogueManager` 与 NPC 对话的触发、分支选择、事件链。
|
||
|
||
### 步骤
|
||
|
||
1. 走到场景中有对话触发的 NPC,按**交互键**(E)
|
||
|
||
**预期**:
|
||
- 对话 UI 面板打开
|
||
- 第一行对话文本正确显示(逐字显示动效)
|
||
- 游戏输入暂时切换为"对话输入"(按键 E/Space 翻页,WASD 选择选项)
|
||
|
||
2. 按 E/Space 翻页
|
||
|
||
**预期**:逐行显示对话,直到当前节点末尾。
|
||
|
||
3. 遇到分支选项时(如"同意/拒绝")
|
||
|
||
**预期**:
|
||
- 分支选项 UI 显示
|
||
- 上下移动光标选择
|
||
- 按确认键执行对应分支逻辑
|
||
|
||
4. 对话结束后
|
||
|
||
**预期**:
|
||
- 对话 UI 关闭
|
||
- 游戏输入恢复正常
|
||
- 若对话触发任务/事件:相关 EventChannel 已触发(EventBusMonitor 可见)
|
||
|
||
| 检查点 | 期望 | ✓ |
|
||
|--------|------|---|
|
||
| 对话 UI 打开 | 交互后对话面板显示 | ☐ |
|
||
| 逐字显示 | 文字逐字出现动效 | ☐ |
|
||
| 分支选择 | 分支选项响应方向键 | ☐ |
|
||
| 对话结束 | UI 关闭,输入恢复 | ☐ |
|
||
| 事件触发 | 对话触发的事件正确执行 | ☐ |
|