AudioMgr.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //AudioMgr.ts
  2. import { Node, AudioSource, AudioClip, resources, director, assetManager } from 'cc';
  3. /**
  4. * @en
  5. * this is a sington class for audio play, can be easily called from anywhere in you project.
  6. * @zh
  7. * 这是一个用于播放音频的单件类,可以很方便地在项目的任何地方调用。
  8. */
  9. export class AudioMgr {
  10. private static _inst: AudioMgr;
  11. public static get inst(): AudioMgr {
  12. if (this._inst == null) {
  13. this._inst = new AudioMgr();
  14. }
  15. return this._inst;
  16. }
  17. private _audioSource: AudioSource;
  18. private _musicVolume = 1.0;
  19. private _musicVolumeScale = 1.0;
  20. private _soundVolume = 1.0;
  21. constructor() {
  22. //@en create a node as audioMgr
  23. //@zh 创建一个节点作为 audioMgr
  24. let audioMgr = new Node();
  25. audioMgr.name = '__audioMgr__';
  26. //@en add to the scene.
  27. //@zh 添加节点到场景
  28. director.getScene().addChild(audioMgr);
  29. //@en make it as a persistent node, so it won't be destroied when scene change.
  30. //@zh 标记为常驻节点,这样场景切换的时候就不会被销毁了
  31. director.addPersistRootNode(audioMgr);
  32. //@en add AudioSource componrnt to play audios.
  33. //@zh 添加 AudioSource 组件,用于播放音频。
  34. this._audioSource = audioMgr.addComponent(AudioSource);
  35. }
  36. public get audioSource() {
  37. return this._audioSource;
  38. }
  39. public set musicVolume(v: number) {
  40. this._musicVolume = v;
  41. this._audioSource.volume = this._musicVolume * this._musicVolumeScale;
  42. }
  43. public set soundVolume(v: number) {
  44. this._soundVolume = v;
  45. }
  46. /**
  47. * @en
  48. * play short audio, such as strikes,explosions
  49. * @zh
  50. * 播放短音频,比如 打击音效,爆炸音效等
  51. * @param sound clip or url for the audio
  52. * @param volume
  53. */
  54. playOneShot(sound: AudioClip | string, volume: number = 1.0, bundleName: string = 'resources') {
  55. if (sound instanceof AudioClip) {
  56. this._audioSource.volume = 1.0;
  57. this._audioSource.playOneShot(sound, volume * this._soundVolume);
  58. }
  59. else {
  60. let bundle = assetManager.getBundle(bundleName);
  61. bundle.load(sound, (err, clip: AudioClip) => {
  62. if (err) {
  63. console.log(err);
  64. }
  65. else {
  66. this._audioSource.volume = 1.0;
  67. this._audioSource.playOneShot(clip, volume * this._soundVolume);
  68. }
  69. });
  70. }
  71. }
  72. /**
  73. * @en
  74. * play long audio, such as the bg music
  75. * @zh
  76. * 播放长音频,比如 背景音乐
  77. * @param sound clip or url for the sound
  78. * @param volume
  79. */
  80. play(sound: AudioClip | string, volume: number = 1.0, bundleName: string = 'resources') {
  81. this._musicVolumeScale = volume;
  82. if (sound instanceof AudioClip) {
  83. this._audioSource.stop();
  84. this._audioSource.clip = sound;
  85. this._audioSource.play();
  86. this.audioSource.volume = this._musicVolume * this._musicVolumeScale;
  87. }
  88. else {
  89. let bundle = assetManager.getBundle(bundleName);
  90. bundle.load(sound, (err, clip: AudioClip) => {
  91. if (err) {
  92. console.log(err);
  93. }
  94. else {
  95. this._audioSource.stop();
  96. this._audioSource.clip = clip;
  97. this._audioSource.play();
  98. this.audioSource.volume = this._musicVolume * this._musicVolumeScale;
  99. }
  100. });
  101. }
  102. }
  103. /**
  104. * stop the audio play
  105. */
  106. stop() {
  107. this._audioSource.stop();
  108. }
  109. /**
  110. * pause the audio play
  111. */
  112. pause() {
  113. this._audioSource.pause();
  114. }
  115. /**
  116. * resume the audio play
  117. */
  118. resume() {
  119. this._audioSource.play();
  120. }
  121. }