音频播放示例

由于 Cocos Creator 3.x 移除了 v2.x cc.audioEngine 系列的 API,统一使用 AudioSource 控制音频播放,因此我们需要在项目中将 AudioSource 组件 声明为常驻根节点,并封装一个管理器使用。可参考以下代码:

  1. import { assert, AudioSource, Component, game } from 'cc';
  2. const { ccclass, property } = _decorator;
  3. @ccclass('GameRoot')
  4. export class GameRoot extends Component {
  5. @property(AudioSource)
  6. _audioSource: AudioSource = null!;
  7. onLoad () {
  8. const audioSource = this.node.getComponent(AudioSource)!;
  9. assert(audioSource);
  10. this._audioSource = audioSource;
  11. // 声明常驻根节点,该节点不会在场景切换中被销毁。目标节点必须是根节点,否则无效。
  12. game.addPersistRootNode(this.node);
  13. // 将节点封装到管理器中
  14. audioManager.instance.init(this._audioSource);
  15. }
  16. }

音频管理的具体实现,可参考以下代码:

  1. import { AudioClip, AudioSource, assert, warn, clamp01, resources } from "cc";
  2. export class audioManager {
  3. private static _instance: audioManager;
  4. private static _audioSource?: AudioSource;
  5. static get instance () {
  6. if (this._instance) {
  7. return this._instance;
  8. }
  9. this._instance = new audioManager();
  10. return this._instance;
  11. }
  12. /**管理器初始化*/
  13. init (audioSource: AudioSource) {
  14. audioManager._audioSource = audioSource;
  15. }
  16. /**
  17. * 播放音乐
  18. * @param {Boolean} loop 是否循环播放
  19. */
  20. playMusic (loop: boolean) {
  21. const audioSource = audioManager._audioSource!;
  22. assert(audioSource, 'AudioManager not inited!');
  23. audioSource.loop = loop;
  24. if (!audioSource.playing) {
  25. audioSource.play();
  26. }
  27. }
  28. /**
  29. * 播放音效
  30. * @param {String} name 音效名称
  31. * @param {Number} volumeScale 播放音量倍数
  32. */
  33. playSound (name: string, volumeScale: number = 1 ) {
  34. const audioSource = audioManager._audioSource!;
  35. assert(audioSource, 'AudioManager not inited!');
  36. // 注意:第二个参数 “volumeScale” 是指播放音量的倍数,最终播放的音量为 “audioSource.volume * volumeScale”
  37. audioSource.playOneShot(audioClip, volumeScale);
  38. }
  39. // 设置音乐音量
  40. setMusicVolume (flag: number) {
  41. const audioSource = audioManager._audioSource!;
  42. assert(audioSource, 'AudioManager not inited!');
  43. flag = clamp01(flag);
  44. audioSource.volume = flag;
  45. }
  46. }

以上代码片段只是举例了 AudioSource 组件播放的一种使用方式,并不完整。Creator 在范例项目 快上车GitHub | Gitee)中提供了完整的封装好的音频播放管理器的使用示例。开发者可打开 Dashboard 的 项目 页面,点击右下角的 新建 按钮,进入新建项目页面,即可看到 Example Taxi Game 范例,根据需要填写项目名称和项目位置后即可创建并打开:

audioEdit