废话不多说,直接上代码,这个方法有将音效缓存,用空间换时间,暂时测试没有问题,水平有限,暂时只能写成这个样子,有问题大家欢迎提出指正,一起学习进步,希望可以帮到有需要的人!
export {AudioUtil};
const LOCAL_MUSIC_VOL = "local_musicVol";
const LOCAL_EFFECTS_VOL = "local_effectsVol";
class AudioUtil {
public static CommonEffects = {
click:"click",
}
private static _musicVol:number = 0.5;//声音大小 0 ~ 1
private static _effectVol:number = 0.5;//音效大小 0 ~ 1
private static _audioMap:Map<string,cc.AudioClip> = new Map<string,cc.AudioClip>();
public static get audioMap () {
return AudioUtil._audioMap;
}
public static initSoundData () {
AudioUtil._musicVol = parseInt(cc.sys.localStorage.getItem(LOCAL_MUSIC_VOL));
AudioUtil._effectVol = parseInt(cc.sys.localStorage.getItem(LOCAL_EFFECTS_VOL));
if(AudioUtil._musicVol == null || AudioUtil._musicVol == undefined){
AudioUtil._musicVol = 0.5;
}
if(AudioUtil._effectVol == null || AudioUtil._effectVol == undefined){
AudioUtil._effectVol = 0.5;
}
}
public static setMusicVol(volume:number){
let isMusicPlaying = cc.audioEngine.isMusicPlaying();
if(!isMusicPlaying && AudioUtil._musicVol == 0 && volume > 0){//如果没有播放背景音乐,调高音量恢复播放
cc.audioEngine.resumeMusic();
}
AudioUtil._musicVol = volume;
cc.audioEngine.setMusicVolume(volume);
cc.sys.localStorage.setItem(LOCAL_MUSIC_VOL,volume);
}
public static getMusicVol(){
return AudioUtil._musicVol;
}
public static getEffectsVol(){
return AudioUtil._effectVol;
}
public static setEffectsVol(volume:number){
if(AudioUtil._effectVol == 0 && volume != 0){//如果音量不为0,调高音量恢复播放
cc.audioEngine.resumeAllEffects();
}
AudioUtil._effectVol = volume;
cc.audioEngine.setEffectsVolume(volume);
cc.sys.localStorage.setItem(LOCAL_EFFECTS_VOL,volume);
}
public static stopAll(){
cc.audioEngine.stopAll();
}
public static async playMusic(path:string){
let clip = await AudioUtil.getAudioClip(path);
if (!clip){
cc.error(" 未加载到背景音乐资源!!! ");
return;
}
if (AudioUtil._musicVol == 0) {
cc.audioEngine.pauseMusic();
cc.error(" 音乐已经关闭 ");
return;
}
this.stopAll();
cc.audioEngine.playMusic(clip, true);
}
public static async playEffect(path:string){
let clip = await AudioUtil.getAudioClip(path);
if (!clip){
cc.error(" 未加载到音效资源!!! ");
return;
}
if (AudioUtil._effectVol == 0) {
cc.audioEngine.pauseAllEffects();
cc.error(" 音效已经关闭 ");
return;
}
cc.audioEngine.playEffect(clip, false);
}
public static async getAudioClip(path:string):Promise<cc.AudioClip>{
let sfx:cc.AudioClip = AudioUtil.audioMap.get(path);
/** 这里将音效缓存,用空间节省时间 */
if(sfx){
return sfx;
}
sfx = await AudioUtil.load(path);
AudioUtil.audioMap.set(path, sfx); // 缓存音效
return sfx;
}
public static load(path: string): Promise<cc.AudioClip> {
return new Promise(callFunc => {
//2.4 + cc.resources.load
//2.0 + cc.loader.loadRes
cc.loader.loadRes(path, (error: Error, audioClip: cc.AudioClip) => {
if (error) {
callFunc(null);
} else {
callFunc(audioClip);
}
});
});
}
}