微信小遊戲Laya引擎聲音Bug的解決方案

很多使用Laya引擎開發微信小遊戲的開發者都遇到過“聲音異常”的情況,遊戲運行後出現各種莫名其妙的問題,比如背景音樂播不出來,音效播放延遲等等,有時這種Bug還很難復現,甚至無法描述其具體情況。這種Bug我把他成爲“不可描述的Bug”,是Bug的最高境界,Bug中的戰鬥機。

遇到這種問題第一步是檢查代碼邏輯,檢查引擎聲音API是否使用正常。經過測試發現,在Chrome無法復現問題,那麼問題很可能是出在Laya引擎封裝微信底層API的代碼中。

於是在你面前有2條路,一條是研究引擎代碼,看能否找出Bug隱藏在什麼地方,這條路往往比較艱難。第二條是使用egret白鷺引擎的聲音代碼來代替 Laya聲音API,繞開這個問題。

作爲egret引擎資深開發者的我來說,毫不猶豫的選擇了第二條路。

也許你會說,自己是Laya引擎的鐵桿,egret也不熟,怎麼辦?

沒關係!我已經封裝好了相關代碼,按照步驟一一修改就行,5分鐘幫你解決這個終極Bug。

1、下載文件,把壓縮包裏面的2個文件解壓到微信項目文件夾下

這裏是引用(正在等待審覈,明天可下載)

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已修復完,發佈到微信上測試,聲音異常問題不再出現。老闆對你刮目相看,升職加薪發股票,迎娶白富美,走上人生巔峯!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章