diff --git a/assets/core/common/audio/AudioEffect.ts b/assets/core/common/audio/AudioEffect.ts index 578234115779409bf197893206c123a097b1fa43..bc54c4d3da8aa067c0c52347c3b05f34fc6ce7a3 100644 --- a/assets/core/common/audio/AudioEffect.ts +++ b/assets/core/common/audio/AudioEffect.ts @@ -15,7 +15,41 @@ const { ccclass } = _decorator; /** 游戏音效 */ @ccclass('AudioEffect') export class AudioEffect extends AudioSource { - private effects: Map = new Map(); + private effects: Map> = new Map>(); // > + + private addEffect(bundle: string, path: string, data: any): void { + if (!this.effects.has(bundle)) { + this.effects.set(bundle, new Map()); + } + const effectMap = this.effects.get(bundle)!; + effectMap.set(path, data); + } + + // 获取数据 + private getEffect(bundle: string, path: string): any | undefined { + const effectMap = this.effects.get(bundle); + if (effectMap) { + return effectMap.get(path); + } + return undefined; + } + + // 删除数据 + private deleteEffect(bundle: string, path: string): boolean { + const effectMap = this.effects.get(bundle); + if (effectMap) { + if (effectMap.has(path)) { + effectMap.delete(path); + // 如果路径下的捆绑数据为空,则删除该路径 + if (effectMap.size === 0) { + this.effects.delete(bundle); + } + return true; // 删除成功 + } + } + return false; // 删除失败,路径或捆绑不存在 + } + private _progress: number = 0; /** 获取音乐播放进度 */ @@ -38,30 +72,31 @@ export class AudioEffect extends AudioSource { * @param url 音效资源地址 * @param callback 资源加载完成并开始播放回调 */ - load(url: string | AudioClip, callback?: Function) { + load(url: string | AudioClip, bundle: string = oops.res.defaultBundleName, callback?: Function) { // 资源播放音乐对象 if (url instanceof AudioClip) { - this.effects.set(url.uuid, url); - this.playOneShot(url, this.volume); + let realAuido = url as AudioClip; + this.addEffect(bundle, realAuido.uuid, realAuido); + this.playOneShot(realAuido, this.volume); callback && callback(); } else { // 地址加载音乐资源后播放 - if (this.effects.has(url) == false) { - oops.res.load(url, AudioClip, (err: Error | null, data: AudioClip) => { + let audio = this.getEffect(bundle, url); + if (audio == null) { + oops.res.load(bundle, url, AudioClip, (err: Error | null, audio: AudioClip) => { if (err) { error(err); } + this.addEffect(bundle, url, audio); - this.effects.set(url, data); - this.playOneShot(data, this.volume); + this.playOneShot(audio, this.volume); callback && callback(); }); } // 播放缓存中音效 else { - const ac = this.effects.get(url)!; - this.playOneShot(ac, this.volume); + this.playOneShot(audio, this.volume); callback && callback(); } } @@ -69,9 +104,12 @@ export class AudioEffect extends AudioSource { /** 释放所有已使用过的音效资源 */ releaseAll() { - for (let key in this.effects) { - oops.res.release(key); - } + this.effects.forEach((effectMap: Map, url: string)=>{ + effectMap.forEach((audioClip: AudioClip, bundle)=>{ + oops.res.release(url, bundle); + }) + effectMap.clear(); + }); this.effects.clear(); } @@ -79,20 +117,20 @@ export class AudioEffect extends AudioSource { * 释放指定地址音效资源 * @param url 音效资源地址 */ - release(url: string | AudioClip) { + release(url: string | AudioClip, bundle: string = oops.res.defaultBundleName) { var ac: AudioClip | undefined = undefined; if (url instanceof AudioClip) { ac = url; - if (this.effects.has(ac.uuid)) { - this.effects.delete(ac.uuid); + if (this.getEffect(bundle, ac.uuid)) { + this.deleteEffect(bundle, ac.uuid); ac.decRef(); } } else { - ac = this.effects.get(url); + ac = this.getEffect(bundle, url); if (ac) { - this.effects.delete(url); - oops.res.release(url); + this.deleteEffect(bundle, url); + oops.res.release(url, bundle); } } } diff --git a/assets/core/common/audio/AudioManager.ts b/assets/core/common/audio/AudioManager.ts index 8237af4bd22afc90ab738a889a700e9fa22e5f08..03abaa08558a9e4b763abca1d21b6fbe9dc3870c 100644 --- a/assets/core/common/audio/AudioManager.ts +++ b/assets/core/common/audio/AudioManager.ts @@ -41,18 +41,18 @@ export class AudioManager extends Component { * @param url 资源地址 * @param callback 音乐播放完成事件 */ - playMusic(url: string, callback?: Function) { + playMusic(url: string, bundle: string = oops.res.defaultBundleName, callback?: Function) { if (this._switch_music && !this.music.playing) { this.music.loop = false; - this.music.load(url, callback); + this.music.load(url, bundle, callback); } } /** 循环播放背景音乐 */ - playMusicLoop(url: string) { + playMusicLoop(url: string, bundle: string = oops.res.defaultBundleName) { if (this._switch_music && !this.music.playing) { this.music.loop = true; - this.music.load(url); + this.music.load(url, bundle); } } @@ -113,15 +113,15 @@ export class AudioManager extends Component { * 播放音效 * @param url 资源地址 */ - playEffect(url: string | AudioClip) { + playEffect(url: string | AudioClip, bundle?: string) { if (this._switch_effect) { - this.effect.load(url); + this.effect.load(url, bundle); } } /** 释放音效资源 */ - releaseEffect(url: string | AudioClip) { - this.effect.release(url); + releaseEffect(url: string | AudioClip, bundle?: string) { + this.effect.release(url, bundle); } /** diff --git a/assets/core/common/audio/AudioMusic.ts b/assets/core/common/audio/AudioMusic.ts index b6e676d1d28ca1ff909f959b687de14bab7cfe88..f1e0ded3a1f350e4622dfc882700ccdc44199a27 100644 --- a/assets/core/common/audio/AudioMusic.ts +++ b/assets/core/common/audio/AudioMusic.ts @@ -16,6 +16,7 @@ export class AudioMusic extends AudioSource { private _progress: number = 0; private _url: string = null!; + private _bundle: string = null!; private _isPlay: boolean = false; /** 获取音乐播放进度 */ @@ -38,9 +39,9 @@ export class AudioMusic extends AudioSource { * @param url 音乐资源地址 * @param callback 加载完成回调 */ - load(url: string, callback?: Function) { + load(url: string, bundle: string = oops.res.defaultBundleName, callback?: Function) { if (this._url == null) { - oops.res.load(url, AudioClip, (err: Error | null, data: AudioClip) => { + oops.res.load(bundle, url, AudioClip, (err: Error | null, data: AudioClip) => { if (err) { error(err); } @@ -48,11 +49,11 @@ export class AudioMusic extends AudioSource { // 注:事件定义在这里,是为了在播放前设置初始播放位置数据 callback && callback(); - this.playPrepare(url, data); + this.playPrepare(url, bundle, data); }); } else { - this.playPrepare(url, this.clip!); + this.playPrepare(url, bundle, this.clip!); } } @@ -62,7 +63,7 @@ export class AudioMusic extends AudioSource { super.stop(); } - private playPrepare(url: string, data: AudioClip) { + private playPrepare(url: string, bundle: string, data: AudioClip) { if (this.playing) { this._isPlay = false; this.stop(); @@ -70,7 +71,7 @@ export class AudioMusic extends AudioSource { if (this._url) { this.clip = null; - oops.res.release(this._url); + oops.res.release(this._url, bundle); } this.enabled = true; @@ -79,6 +80,7 @@ export class AudioMusic extends AudioSource { this.play(); this._url = url; + this._bundle = bundle; } /** cc.Component 生命周期方法,验证背景音乐播放完成逻辑,建议不要主动调用 */ @@ -100,8 +102,9 @@ export class AudioMusic extends AudioSource { release() { if (this._url) { this.clip = null; - oops.res.release(this._url); + oops.res.release(this._url, this._bundle); this._url = null!; + this._bundle = null; } } } diff --git a/assets/module/common/GameComponent.ts b/assets/module/common/GameComponent.ts index 70c47cb1d96ea1246a3d9dd0fdbcee8dbf57dd19..13941dc5e67943799510db2cfa62487fa8dcdd0c 100644 --- a/assets/module/common/GameComponent.ts +++ b/assets/module/common/GameComponent.ts @@ -121,7 +121,6 @@ export class GameComponent extends Component { //#region 资源加载管理 /** 资源路径 */ - private resPathsAudioEffect: Map = null!; // 音效类资源 private resPaths: Map> = null!; // 资源使用记录 /** @@ -263,18 +262,21 @@ export class GameComponent extends Component { rps.forEach((value: ResRecord) => { oops.res.releaseDir(value.path, value.bundle); }); + rps.clear(); } } } /** 释放音效资源 */ releaseAudioEffect() { - if (this.resPathsAudioEffect) { - this.resPathsAudioEffect.forEach((value: string, key: string) => { - oops.audio.effect.release(key); - }); - this.resPathsAudioEffect.clear(); - this.resPathsAudioEffect = null!; + if (this.resPaths) { + var rps = this.resPaths.get(ResType.Audio); + if (rps) { + rps.forEach((value: ResRecord) => { + oops.audio.effect.release(value.path, value.bundle); + }); + rps.clear(); + } } } //#endregion @@ -284,28 +286,26 @@ export class GameComponent extends Component { * 播放背景音乐 * @param url 资源地址 */ - playMusic(url: string) { - oops.audio.playMusic(url); + playMusic(url: string, bundle: string = oops.res.defaultBundleName) { + oops.audio.playMusic(url, bundle); } /** * 循环播放背景音乐 * @param url 资源地址 */ - playMusicLoop(url: string) { + playMusicLoop(url: string, bundle: string = oops.res.defaultBundleName) { oops.audio.stopMusic(); - oops.audio.playMusicLoop(url); + oops.audio.playMusicLoop(url, bundle); } /** * 播放音效 * @param url 资源地址 */ - playEffect(url: string) { - if (this.resPathsAudioEffect == null) this.resPathsAudioEffect = new Map(); - - this.resPathsAudioEffect.set(url, oops.res.defaultBundleName); - oops.audio.playEffect(url); + playEffect(url: string, bundleName: string = oops.res.defaultBundleName) { + this.addPathToRecord(ResType.Audio, bundleName, url); + oops.audio.playEffect(url, bundleName); } //#endregion