首页/ 第 11 章 · 音频系统/ 第 172 课
LESSON 172 · 音频系统

播放背景音乐

背景音乐系统完成。下一课学播放音效。

⏱ 约 14 分钟📊 难度:入门🗂 第 11 章 · 音频系统📍 第 172 / 300 课
课程进度
172 / 300

🎯本节学习目标

  • 实现循环 BGM
  • 实现音乐切换
  • 实现跨场景延续

🚀课程导读

游戏一开就有背景音乐、切换场景不停。本课做一个“打不死”的 BGM 系统。

基础循环播放

最简单的 BGM。

  1. 创建空对象 BGM,加 AudioSource。
  2. 【设置】AudioClip 拖入背景音乐;勾选 Loop(循环);勾选 Play On Awake(开局就播)。
  3. 【音量】Volume 设 0.6 左右。
  4. 【播放】运行即响,循环不断。
  5. 【代码控制】
  6. AudioSource bgm;
  7. void Start() { bgm = GetComponent<AudioSource>(); }
  8. public void PlayMusic(AudioClip clip) { bgm.clip = clip; bgm.Play(); }
  9. public void StopMusic() { bgm.Stop(); }
  10. public void SetVolume(float v) { bgm.volume = v; }
  11. 【切换音乐】换关卡时调用 PlayMusic(新音乐)。
  12. 【淡入淡出】切换时音量渐出渐入(协程)。
  13. 【注意】Loop 必须勾选,否则音乐播完就停。
💡
BGM 核心:Loop 循环 + Play On Awake + 代码可切换。

跨场景延续(DontDestroyOnLoad)

切场景音乐不断。

  1. 【问题】切场景会销毁当前场景对象,BGM 停掉。
  2. 【解决】用 DontDestroyOnLoad 让 BGM 对象跨场景存活:
  3. public class BGM : MonoBehaviour {
  4. public static BGM Instance;
  5. void Awake() {
  6. if (Instance != null) { Destroy(gameObject); return; } // 防重复
  7. Instance = this;
  8. DontDestroyOnLoad(gameObject);
  9. }
  10. }
  11. 【说明】首个 BGM 保留并跨场景;重复进入时销毁新增的。
  12. 【完整单例音乐管理器】把 PlayMusic/SetVolume 等并入,全局可用(第 86 课单例)。
  13. 【切场景验证】从主菜单进游戏,音乐不断。
  14. 【注意】DontDestroyOnLoad 的对象会在场景切换时保留,注意别造成重复。
  15. 【进阶】按场景切换不同 BGM(在场景加载时触发切换)。
跨场景 BGM = 单例 + DontDestroyOnLoad。所有全局管理器都用这套。

常见错误与排查

错误:切场景后两个音乐同时响?
原因:BGM 对象被重复创建
解决:用单例检查 Instance 已存在则 Destroy 新对象(Awake 里)。

动手练习

课后小任务(做出来才算真的学会)

  • 实现循环 BGM 并控制音量
  • 用单例实现跨场景延续
  • 实现切换不同 BGM

本节小结

背景音乐系统完成。下一课学播放音效。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课音频系统总览与 AudioSource