音效系统SFXManager

背景

  音效 简称 SFX ,框架的音效系统,支持音效的动态加载、播放、音量控制、淡入淡出等常见操作,同时能够管理不同类型的音效资源和音量设置。可以满足基本音效使用要求。同样的,基于模块化原则,开发者可以使用其他音效解决方案,只需实现SFXManager中的必要接口函数,即可无缝切换音乐解决方案,比如 Master Audio 和Wwise等插件。

使用

数据结构

音效系统将音效进行分类,音效类别定义枚举文件路径:项目路径\Luban\Datas\Enums\DefSFXType.xlsx
预设 常规音效Se 和 语音Voice :

SFX数据配置

配置表路径:项目路径\Luban\Datas\SFX.xlsx
其中clipPaths可以填写多个 音效资源文件的aa路径 ,通过英文逗号隔开,即可完成随机选择音效文件进行播放的功能。Luban将clipsPaths定义为List。

播放音效

oneShot为True时,重复播放不会中断上一次的该音效播放事件,为False时会中断并重新播放该音效,与unity内的oneShot含义保持一致。

1
2
3
4
5
6
7
// 即时播放
// SFXManager.Instance.PlaySfx(音效名);
SFXManager.Instance.PlaySfx("test");

// 异步播放,等待延迟播放时间
// 协程 SFXManager.Instance.PlaySfxDelay(音效名, 延迟播放时间);
StartCoroutine(SFXManager.Instance.PlaySfxDelay("test", 0.1f));

停止音效

  • 停止当前正在播放的指定音效
    异步播放的音效需要等到音效真正播放后才能停止音效的播放,播放前请拿到协程的句柄,手动停止协程。
    1
    2
    // SFXManager.Instance.Stop(音效名);
    SFXManager.Instance.Stop("test");
  • 停止播放当前所有正在播放的音效
    1
    SFXManager.Instance.StopAllSfx()
  • 带延迟、淡出功能的停止当前正在播放的指定音效
    1
    2
    3
    // 等待 延迟播放时间 + 淡出时间
    // 协程 SFXManager.Instance.StopDelayFadeIEnumerator(音效名, 延迟播放时间, 淡出时间)
    StartCoroutine(SFXManager.Instance.StopDelayFadeIEnumerator("test", 0.1f, 0.2f));

音量控制

  • 设置指定音效类型的所有音效的音量,混响器按音效类型进行拆分
    1
    2
    // SFXManager.Instance.SetVolumeRuntime(音效类型, 音量分贝值)
    SFXManager.Instance.SetVolumeRuntime(DefSFXType.Se, 0.2f)
  • 将指定音效类型的所有音效静音,由于混响器不能直接静音的原因。
    1
    2
    // SFXManager.Instance.MuteVolume(音效类型)
    SFXManager.Instance.MuteVolume(DefSFXType.Se)

注意事项

  • Addressables加载混响器后,应用混响器音量时会变回0dB,bug原因未知。有设置系统的需要手动重新设置SFX音量设置值。

内部实现

  • SFXManager初始化时,会读取SFX.xlsx的所有数据项,每一个数据项生成一个GameObject并添加AudioSource组件,SFXManager内部维护 AudioSource字典 <配置表数据项,AudioSource>
    1
    private Dictionary<RowCfgSFX, AudioSource> _sfxItems;
  • SFXManager使用一个全局的混响器AudioMixer,混响器以音效类型定义枚举进行输出拆分,混响器资源文件路径:项目路径\Assets\AddressableAssets\AudioMixer\AudioMixer.mixer
  • 设置音效类型的音量时,通过混响器参数进行设置,同时SFXManager内部维护了混响器的输出组字典 <音效类型, 输出组>
    1
    private readonly Dictionary<DefSFXType, AudioMixerGroup> _sfxMixerGroupDic;