微信小游戏Laya引擎声音Bug的解决方案

很多使用Laya引擎开发微信小游戏的开发者都遇到过“声音异常”的情况,游戏运行后出现各种莫名其妙的问题,比如背景音乐播不出来,音效播放延迟等等,有时这种Bug还很难复现,甚至无法描述其具体情况。这种Bug我把他成为“不可描述的Bug”,是Bug的最高境界,Bug中的战斗机。

遇到这种问题第一步是检查代码逻辑,检查引擎声音API是否使用正常。经过测试发现,在Chrome无法复现问题,那么问题很可能是出在Laya引擎封装微信底层API的代码中。

于是在你面前有2条路,一条是研究引擎代码,看能否找出Bug隐藏在什么地方,这条路往往比较艰难。第二条是使用egret白鹭引擎的声音代码来代替 Laya声音API,绕开这个问题。

作为egret引擎资深开发者的我来说,毫不犹豫的选择了第二条路。

也许你会说,自己是Laya引擎的铁杆,egret也不熟,怎么办?

没关系!我已经封装好了相关代码,按照步骤一一修改就行,5分钟帮你解决这个终极Bug。

1、下载文件,把压缩包里面的2个文件解压到微信项目文件夹下

https://download.csdn.net/download/linguifa/12458822

2、引入文件,在game.js 最后一行加入代码:

require("./laya.sound.min.js");

3、修改项目ts代码,找到你调用Laya播放声音的代码的位置,按如下方式修改:
//播放网络路径的音乐或音效

window["RES"].getResByUrl(url,(sound)=>{
	if(sound) {
	    /*
	     * play 第1个参数 表示应开始播放的初始位置(以秒为单位),默认值是 0
	     * play 第2个参数 表示播放次数,默认值是 0,循环播放。 大于 0 为播放次数,如 1 为播放 1 次;小于等于 0,为循环播放。
	     * */
	    sound.play(0,1); 
	}
},this)

//如果想控制背景音乐的播放与暂停,修改音量呢? 那就需要保存住声音对象的引用

var soundChannel:any;
window["RES"].getResByUrl(url,(sound)=>{
	if(sound) {
	    /*
	     * play 第1个参数 表示应开始播放的初始位置(以秒为单位),默认值是 0
	     * play 第2个参数 表示播放次数,默认值是 0,循环播放。 大于 0 为播放次数,如 1 为播放 1 次;小于等于 0,为循环播放。
	     * */
	    this.soundChannel = sound.play(0,1); 
		//修改音量 (默认值是1,取值范围0-1)
		this.currentChannel.volume = 0.5;
	
		//停止播放
	    setTimeout(()=>{
			this.currentChannel.stop();
	    }, 5000);
	}
},this)

注意,以上代码需要用到 window[“RES”],也就是在game.js里面引入的js里面的对象。本地开发的时候是没有 window[“RES”]对象的,因此需要加个判断:

if(window["RES"]){
	//使用egret RES方式播放音乐
}
else{
	//仍然使用Laya api 播放音乐
}

至此,Bug已修复完,发布到微信上测试,声音异常问题不再出现。老板对你刮目相看,升职加薪发股票,迎娶白富美,走上人生巅峰!

你可能感兴趣的:(小游戏开发)