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) × volumeMultiplier(类型倍率 01)。

播放接口

接口行为
PlayRequest带频率限制(2 秒内同类型只播一次)
PlayRequestImmediate强制播放,不受频率限制
PlayRequestBreakOff打断同类音效重新播放,适合点击音效
PlayLoopRequest / StopLoopRequset循环播放 / 停止循环
StopAllSounds停止全部音频并清理缓存

对象池与频率限制

  • AudioSource 对象池:优先复用空闲音源,无空闲则新建(只创建不清理、无上限)。
  • 频率限制:m_retentionTimers 字典记录播放计时,Update() 中推进,超时移出。

局限与扩展

  • 局限:无空间音频、音效处理、动态优先级调度、Unity AudioMixer;音源同一根对象,适合 2D。
  • 扩展方向:事件驱动播放(监听事件自动播放对应音频,降低模块耦合)。

关联概念

来源回溯