1. 程式人生 > >Cocos Creator 微信小遊戲 填坑記錄

Cocos Creator 微信小遊戲 填坑記錄

本文由本人簡書搬遷至此,並做小幅修改。

環境:(ccc-v1.9.1, wx-v1.02.1804251)

  1. 微信小遊戲禁止了動態生成並執行程式碼的功能,window.eval()、 new Function() ,這些都不能用了。

  2. 微信小遊戲中window.atob window.btoa 未定義,
    解決:用了這個Base64.js 庫。

  3. protobuf.js 6.x 中用到了 new Function(),所以不能用。
    解決:改用了protobuf.js的分支 protobuf.js 5.x

  4. XMLHttpRequest 在微信小遊戲中實際上會被替換成,或最終呼叫wx.request。
    傳送訊息時, 在都發送 uint8Array 型別的資料的情況下,
    --->在web中,服務端能收到arrayBuffer二進位制流。
    --->在微信小遊戲中,服務端收到的是一個string, 格式會遵從微信API wx.request的傳送規則 (見下圖)。

     

猜測在web中會自動將uint8Array 轉為ArrayBuffer然後傳送。
而在微信小遊戲中,uint8Array 會被認為是一個table。如下:

當header為 ("Content-Type", "application/octet-stream")時,伺服器收到的結果:

當header為 ("Content-Type", "application/x-www-form-urlencoded")時,伺服器收到的結果:

當header為 ("Content-Type", "application/json")
如果傳送的資料格式從uint8Array改成Array,伺服器收到的結果:

結論:(1).如果要發二進位制,務必務必要在傳送前將資料格式轉為ArrayBuffer。
(2).微信小遊戲文件裡的 wx.request 和微信小程式裡的 wx.request 其實是一回事,但是微信分開來寫了,並且表述的內容不一致(是兩個人分別寫的嗎?坑爹啊),
小遊戲裡的文件裡這個wx.request的引數有dataType,沒有 responseType。並且,經過實測 必須制定responseType : "arraybuffer", 才能讓返回資料為 ArrayBuffer, 只制定dataType沒卵用,這點與文件描述不符。

  1. json檔案,在web和模擬器環境載入後會直接變為 object/Array 型別,在小遊戲中載入後,是一個 string。原因:我的json檔案是在C#中匯出的,匯出時是帶BOM的UTF8編碼的檔案。 因此json的首字元被添加了一個AscII碼為65279的字元。
    臨時解決: 在載入完後判斷型別,如果為string,則去掉,並且去掉第一個AscII碼為65279的字元。最終: 在C#匯出時,去掉了BOM。
    另外,使用cc.loader.loadResDir 載入Json檔案目錄時, 在web下正常, 在微信中會返回一個空的Array。

  2. ccc釋出到小遊戲中時,不勾選除錯模式的話,為節省程式碼檔案大小,所有自定義型別會被混淆和簡化,所以不能寫 xxx === "某自定義型別名" 這樣的判斷程式碼,或其他寫死型別名的程式碼。

  3. 手機中預覽黑屏。
    原因:開啟手機上除錯模式,對應模擬器中的“不校驗安全域名”,如果不開啟除錯模式,微信不允許訪問那些沒有新增到安全域名的連結。另外,如果已經正確配置了域名,卻沒有取消勾選“不校驗安全域名”, 也是不能的。解決: 在後臺配置正確域名,並取消勾選“不校驗安全域名”。

  4. ccc提供的AudioSrouce 裡的mute 和 pause 等,在小遊戲裡無效。最後換成了AudioEngine。

  5. ccc的button有問題: 按住A按鈕,再按住B按鈕,鬆開A觸發點選事件開啟介面,遮擋B, 這時送開按B的手指,仍然會觸發B按鈕的點選事件。