Files
pixelheros/.qoder/repowiki/zh/content/辅助系统/音效管理系统.md
panw 4235e3b776 refactor(game): 移除已弃用的事件常量
- 删除 UpdateHero 和 UpdateFightHero 事件
- 移除 MISSION_UPDATE 事件常量
- 优化游戏事件枚举定义
2025-10-28 16:15:47 +08:00

301 lines
10 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.
# 音效管理系统
<cite>
**本文档引用文件**
- [audio.md](file://doc/core/common/audio.md)
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts)
- [AudioMusic.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioMusic.ts)
- [AudioEffect.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioEffect.ts)
- [Root.ts](file://extensions/oops-plugin-framework/assets/core/Root.ts)
- [GameComponent.ts](file://extensions/oops-plugin-framework/assets/module/common/GameComponent.ts)
</cite>
## 目录
1. [简介](#简介)
2. [核心功能](#核心功能)
3. [背景音乐管理](#背景音乐管理)
4. [音效管理](#音效管理)
5. [播放状态控制](#播放状态控制)
6. [用户设置持久化](#用户设置持久化)
7. [关键节点集成示例](#关键节点集成示例)
8. [性能优化建议](#性能优化建议)
9. [系统架构](#系统架构)
10. [依赖关系](#依赖关系)
## 简介
Oops Framework 音效管理模块为游戏提供完整的音频解决方案,涵盖背景音乐与音效两大核心功能。该系统在游戏启动时自动初始化,支持异步资源加载、音量控制、播放状态管理及用户偏好设置的本地持久化。通过简洁的接口设计,开发者可轻松在游戏各关键节点集成音效,提升用户体验。
**Section sources**
- [audio.md](file://doc/core/common/audio.md#L1-L10)
- [Root.ts](file://extensions/oops-plugin-framework/assets/core/Root.ts#L85-L93)
## 核心功能
音效管理系统提供以下核心功能:
- 背景音乐与音效的异步加载与播放
- 独立的音量控制musicVolume 与 volumeEffect
- 开关状态管理switchMusic 与 switchEffect
- 播放进度控制progressMusic
- 全局播放状态控制pauseAll/resumeAll/stopAll
- 用户音频设置的本地持久化save/load
```mermaid
flowchart TD
A[音效管理系统] --> B[背景音乐管理]
A --> C[音效管理]
A --> D[状态控制]
A --> E[数据持久化]
B --> F[异步加载]
B --> G[音量控制]
B --> H[进度控制]
C --> I[异步加载]
C --> J[音量控制]
D --> K[暂停/恢复/停止]
E --> L[保存/加载]
```
**Diagram sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L10-L201)
## 背景音乐管理
### 播放与加载机制
通过 `playMusic``playerMusicLoop` 方法播放背景音乐,系统会异步加载音频资源。播放前会自动释放先前的音乐资源,确保内存高效利用。
```mermaid
sequenceDiagram
participant 游戏逻辑
participant AudioManager
participant AudioMusic
participant 资源系统
游戏逻辑->>AudioManager : playMusic("audios/nocturne")
AudioManager->>AudioManager : 检查switchMusic开关
AudioManager->>AudioMusic : load(url)
AudioMusic->>资源系统 : oops.res.load(url, AudioClip)
资源系统-->>AudioMusic : 返回AudioClip
AudioMusic->>AudioMusic : 停止当前播放,设置新音频
AudioMusic->>AudioMusic : 开始播放
```
**Diagram sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L37-L55)
- [AudioMusic.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioMusic.ts#L40-L60)
### 音量与开关控制
提供 `volumeMusic` 属性设置背景音乐音量范围0-1`switchMusic` 属性控制开关状态。关闭时会自动停止播放。
**Section sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L65-L85)
### 进度控制
通过 `progressMusic` 属性获取或设置音乐播放进度0-1。设置时会自动调整 `currentTime` 实现跳转。
**Section sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L57-L63)
## 音效管理
### 播放机制
通过 `playEffect` 方法播放音效,系统异步加载音频资源后使用 `playOneShot` 播放。每个音效资源会被缓存,避免重复加载。
```mermaid
sequenceDiagram
participant 游戏逻辑
participant AudioManager
participant AudioEffect
participant 资源系统
游戏逻辑->>AudioManager : playEffect("audios/Gravel")
AudioManager->>AudioManager : 检查switchEffect开关
AudioManager->>AudioEffect : load(url)
AudioEffect->>资源系统 : oops.res.load(url, AudioClip)
资源系统-->>AudioEffect : 返回AudioClip
AudioEffect->>AudioEffect : 缓存AudioClip
AudioEffect->>AudioEffect : playOneShot(data, volume)
```
**Diagram sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L101-L108)
- [AudioEffect.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioEffect.ts#L20-L35)
### 音量与开关控制
提供 `volumeEffect` 属性设置音效音量范围0-1`switchEffect` 属性控制开关状态。关闭时会停止所有音效播放。
**Section sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L110-L128)
## 播放状态控制
系统提供全局播放状态控制方法:
- `pauseAll()`:暂停所有音乐与音效
- `resumeAll()`:恢复所有暂停的音乐与音效
- `stopAll()`:停止所有音乐与音效播放
这些方法在游戏切入后台时自动调用,确保良好的用户体验。
```mermaid
stateDiagram-v2
[*] --> 播放中
播放中 --> 暂停 : pauseAll()
暂停 --> 播放中 : resumeAll()
播放中 --> 停止 : stopAll()
暂停 --> 停止 : stopAll()
停止 --> 播放中 : playMusic/playEffect
```
**Diagram sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L130-L150)
- [Root.ts](file://extensions/oops-plugin-framework/assets/core/Root.ts#L109-L119)
## 用户设置持久化
系统使用本地存储保存和加载用户音频设置,包括音量和开关状态。
### 保存设置
`save()` 方法将当前音量和开关状态序列化为JSON字符串并存储到本地。
### 加载设置
`load()` 方法在初始化时自动调用,从本地加载设置并应用到音频系统。如果数据损坏,则使用默认值。
```mermaid
flowchart TD
A[初始化] --> B[调用load()]
B --> C{本地数据存在?}
C --> |是| D[解析JSON数据]
C --> |否| E[使用默认值]
D --> F{解析成功?}
F --> |是| G[应用音量和开关设置]
F --> |否| H[使用默认值]
G --> I[初始化AudioMusic和AudioEffect组件]
H --> I
I --> J[系统就绪]
```
**Diagram sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L152-L198)
## 关键节点集成示例
### 游戏启动
在游戏启动时,系统自动初始化音频管理器并加载用户设置:
```typescript
// Root.ts 中的初始化代码
oops.audio = this.persistRootNode.addComponent(AudioManager);
oops.audio.load(); // 加载用户音频设置
```
**Section sources**
- [Root.ts](file://extensions/oops-plugin-framework/assets/core/Root.ts#L92-L93)
### 战斗开始
在战斗相关组件中,可通过封装的方法播放音效:
```typescript
// GameComponent.ts 中的封装方法
playEffect(url: string) {
this.resPaths.set(url, oops.res.defaultBundleName);
oops.audio.playEffect(url);
}
```
**Section sources**
- [GameComponent.ts](file://extensions/oops-plugin-framework/assets/module/common/GameComponent.ts#L180-L196)
### 技能释放
在技能控制组件中,可根据技能类型播放相应音效:
```typescript
// 示例:技能释放时播放音效
this.HeroView.playSkillEffect(skill_id);
// 内部实现可能调用 oops.audio.playEffect(...)
```
**Section sources**
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L720-L746)
## 性能优化建议
### 避免频繁创建
- 音效资源会被缓存,避免重复加载
- 使用 `playOneShot` 而非创建多个 AudioSource 组件
- 在对象销毁时调用 `release()` 释放资源
### 音量层级管理
- 合理设置 `volumeMusic``volumeEffect` 的默认值
- 提供用户界面让玩家自定义音量
- 背景音乐音量通常低于音效音量,保持平衡
### 资源管理
- 使用资源路径规范,便于管理和加载
- 在适当时机预加载常用音效
- 定期清理不常用的音效缓存
**Section sources**
- [AudioEffect.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioEffect.ts#L37-L44)
- [AudioMusic.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioMusic.ts#L80-L89)
## 系统架构
音效管理系统采用组件化设计,核心类关系如下:
```mermaid
classDiagram
class AudioManager {
+local_data : any
+music : AudioMusic
+effect : AudioEffect
+playMusic(url : string)
+playEffect(url : string)
+pauseAll()
+resumeAll()
+stopAll()
+save()
+load()
}
class AudioMusic {
+onComplete : Function | null
+progress : number
+volume : number
+load(url : string)
+play()
+pause()
+stop()
}
class AudioEffect {
+effects : Map~string, AudioClip~
+load(url : string)
+playOneShot()
+release()
}
AudioManager --> AudioMusic : "包含"
AudioManager --> AudioEffect : "包含"
AudioMusic --|> AudioSource : "继承"
AudioEffect --|> AudioSource : "继承"
```
**Diagram sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L10-L201)
- [AudioMusic.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioMusic.ts#L10-L90)
- [AudioEffect.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioEffect.ts#L10-L45)
## 依赖关系
音效管理系统依赖于框架的其他核心模块:
```mermaid
graph TB
AudioManager --> oops.res : "资源加载"
AudioManager --> oops.storage : "本地存储"
AudioManager --> oops.log : "错误日志"
Root --> AudioManager : "初始化"
GameComponent --> AudioManager : "使用接口"
subgraph "核心依赖"
oops.res
oops.storage
oops.log
end
subgraph "使用方"
Root
GameComponent
其他游戏组件
end
```
**Diagram sources**
- [AudioManager.ts](file://extensions/oops-plugin-framework/assets/core/common/audio/AudioManager.ts#L1-L201)
- [Root.ts](file://extensions/oops-plugin-framework/assets/core/Root.ts#L85-L143)