Unity 音频管理器
摘要
适用于快速原型开发与小型 2D 游戏项目的音频管理方案:单例全局控制 + ScriptableObject 配置分离 + 简易 AudioSource 对象池 + 播放频率限制 + 全局音量与类型音量倍率双层控制。不涉及空间音频与 Audio Mixer,大型 3D 场景能力不足。
架构组成
- SoundsManager:PersistentMonoSingleton 单例,全局播放/停止/音量控制。
- SoundsConfig:ScriptableObject 配置,音频类型枚举 + AudioClip 数组 + 音量倍率。
- Timer:播放计时器,实现频率限制冷却。
- 所有音源挂载于同一根 GameObject(DontDestroyOnLoad)。
配置设计(SoundsConfig)
Sounds枚举定义音频类型(Upgrade、ClickBtn、GameSuccess、BGM 等)。SoundEntry包装key + AudioClip[] + volumeMultiplier,支持同一类型多个音频随机播放。- SO 用 List 存储 SoundEntry(字典不可序列化),访问器懒转换为字典并缓存。
- 双重音量:
soundsVolume(全局 01) ×1)。volumeMultiplier(类型倍率 0
播放接口
| 接口 | 行为 |
|---|---|
| PlayRequest | 带频率限制(2 秒内同类型只播一次) |
| PlayRequestImmediate | 强制播放,不受频率限制 |
| PlayRequestBreakOff | 打断同类音效重新播放,适合点击音效 |
| PlayLoopRequest / StopLoopRequset | 循环播放 / 停止循环 |
| StopAllSounds | 停止全部音频并清理缓存 |
对象池与频率限制
- AudioSource 对象池:优先复用空闲音源,无空闲则新建(只创建不清理、无上限)。
- 频率限制:
m_retentionTimers字典记录播放计时,Update() 中推进,超时移出。
局限与扩展
- 局限:无空间音频、音效处理、动态优先级调度、Unity AudioMixer;音源同一根对象,适合 2D。
- 扩展方向:事件驱动播放(监听事件自动播放对应音频,降低模块耦合)。