BGM系统BGMManager

背景

  考虑到音效播放与BGM播放的具体操作差异较大,BGM更侧重音量控制和循环控制,SFX更侧重重叠播放和播放时机,虽然都同属于音乐播放相关,但还是应该保持各模块封装的功能和工作的单一性,尽量不要在代码中出现BGM和SFX使用同一个播放接口。
  游戏全局仅同时播放一个BGM,并且会进行循环播放。如需同时播放多个BGM请使用音效系统SFXManager播放,并设置音效循环。
  与音效系统SFXManager类似的,封装了常用的BGM操作函数接口,开发者如需使用其他音效解决方案,仅需完成BGMManager中的函数实现,即可无缝切换音效插件。框架的SFXManaget和BGMManager共用同一个混响器AudioMixer,使用不同的输出组。

使用

BGM数据配置

配置表路径:项目路径\Luban\Datas\BGM.xlsx

播放BGM

  • 直接播放
    1
    2
    // BGMManager.Instance.PlayBgm(BGM名, 初始音量 = 1f);
    BGMManager.Instance.PlayBgm("MainTitle", 1f);
  • 异步播放,带淡出上一个BGM、延迟播放、淡入的功能,等待这三个的总时间
    1
    2
    3
    // BGMManager.Instance.PlayBgmFadeDelay(
    // BGM名, 淡出上一个BGM时间, 延迟播放时间, 淡入时间, 初始音量 = 1f)
    BGMManager.Instance.PlayBgmFadeDelay(bgmName, 0.2f, 0f, 0f, 1f);
  • 播放ABB类型循环的BGM,ABB循环,游戏中常见的BGM循环播放方式,即播放A,A结束无缝衔接B,然后B进行循环播放。
    1
    2
    3
    // BGMManager.Instance.PlayLoopBgmWithIntro(
    // A音乐名, B音乐名, 淡出上一个BGM时间, 延迟播放时间, 淡入时间, 初始音量 = 1f);
    BGMManager.Instance.PlayLoopBgmWithIntro("A", "B", 0.2f, 0f, 0f, 1f);

停止播放

  • 直接停止播放
    1
    2
    // 由于游戏BGM仅同时播放一个,所以无需指定bgm名
    BGMManager.Instance.StopBgm()
  • 停止播放,带延迟和淡出时间功能
    1
    2
    // StopBgmFadeDelay(延迟停止时间, 淡出时间, 停止播放后回调callback = null)
    BGMManager.Instance.StopBgmFadeDelay(0f, 0.5f)
  • 异步停止播放,带延迟和淡出时间,等待 延迟停止时间 + 淡出时间
    1
    2
    // 协程 StopBgmFadeDelayCo(延迟停止时间, 淡出时间)
    yield return BGMManager.Instance.StopBgmFadeDelayCo(0, 0.5f);

设置音量

  • 直接设置具体音量值
    1
    2
    // BGMManager.Instance.SetVolumeRuntime(音量分贝值);
    BGMManager.Instance.SetVolumeRuntime(0.5f);
  • 设置音量提高比率,计算公式:当前音量分贝值 * (1 + 音量提高比率)
    1
    2
    // BGMManager.Instance.UpdateVolumeRuntime(音量提高比率);
    BGMManager.Instance.UpdateVolumeRuntime(0.2f);
  • 重置BGM的初始音量,指播放BGM时传入的 初始音量
    1
    BGMManager.Instance.ResetBgmVolume();
  • 由于使用混响器作为输出,不能直接对BGM进行静音操作
    1
    BGMManager.Instance.MuteVolume();

内部实现

  • BGMManager仅维护一个AudioSource,游戏中同时只能播放一个BGM,针对这唯一一个AudioSource作更精细化的操作,以满足各种BGM需求。
  • BGMManager使用混响器的BGM输出组: