Skip to main content
摘要:本文聚焦「Unity 轻量级音频框架」,梳理核心概念、关键方法与落地实践。
概述: 这是一个专为中小型项目(特别是 Roguelike/塔防)设计的纯代码音频管理方案。它不依赖任何第三方插件,通过对象池配置化解决性能与听感问题。

1. 核心架构设计

1.1 功能清单

  • 对象池 (Object Pooling): 预先生成 32-64 个 AudioSource,循环使用,零 GC Alloc。
  • 自动变奏 (Auto-Variation): 播放时自动随机微调 Pitch 和 Volume。
  • 冷却限制 (Cooldown/Throttling): 针对每个音效 ID 设置最小触发间隔,杜绝“爆音”。
  • 空间化自动切换: 支持 2D (UI) 和 3D (世界坐标) 播放模式。

2. 核心代码实现 (SimpleAudioManager.cs)

您可以直接将此脚本挂载在场景中唯一的 AudioManager GameObject 上。

3. 使用指南 (Usage)

3.1 基础调用

在任何代码中,不再需要 GetComponent<AudioSource>,直接调用单例:

3.2 进阶技巧:ScriptableObject 数据分离

上面的代码把数据存在了 Manager 里。对于大型项目,建议把 SoundProfile 抽离成 ScriptableObject
然后 AudioManager 只需持有一个 List<SoundData>

3.3 关于 Audio Mixer

建议在项目中创建 MainMixer
  • Master
    • Music (BGM)
    • SFX (音效)
      • UI
      • Combat
SimpleAudioManagersfxMixerGroup 变量绑定到 SFX 组。这样你可以一键实现“静音音效但保留音乐”。

4. 常见问题

  • 为什么不用 PlayOneShot?
    • AudioSource.PlayOneShot 无法打断。如果你用对象池模式 (source.Play()),当池子转了一圈回到第一个 Source 时,我们可以强制停止旧声音播放新声音,这在子弹极其密集时能有效控制 CPU 负载(旧的没听完就没必要听了)。
  • 3D 声音听不见?
    • 检查 spatialBlend 是否为 1。
    • 检查 AudioListener 是否在摄像机上。