文章

【Unity】WebGL/WEIXINMINIGAME微信小游戏经验总结Learned

【Unity】WebGL/WEIXINMINIGAME微信小游戏经验总结Learned

概述

本文目标在于罗列Unity WebGL项目发布微信小游戏项目所涵盖的概念,相关坑点解决方法,重要的引用文档(方便后续快速查阅)等

概念

  • Q:什么是WebAssembly
  • A:WebAssembly(简称 Wasm)是一种二进制指令格式,设计用于在 Web 浏览器中高效运行。WebAssembly 的目标是提供一种接近原生性能的执行环境,同时保持与现有 Web 技术的兼容性。
    • 它是一种低级别的语言,可以被多种高级语言(如 C、C++、Rust 等)编译成 WebAssembly 字节码,然后在浏览器中运行。
    • WebAssembly 代码在浏览器中以接近原生的速度执行,因为它是在虚拟机中直接运行的二进制代码。
    • WebAssembly 运行在沙箱环境中,具有严格的内存管理和访问限制,确保了安全性。
    • WebAssembly 代码可以拆分为多个模块,每个模块可以独立加载和执行。
    • WebAssembly 代码可以与 JavaScript 无缝集成,通过 JavaScript 调用 WebAssembly 函数,反之亦然。

## 常见问题

  • 微信小游戏不支持WebGL默认的indexDB文件存储,也就是不支持System.IO.File利用IndexDB读写,因此通过C# API存储的文件只会临时存在于内存当中,而不会持久化到手机存储中,退出游戏后即清理。需要持久保存文件,请使用微信SDK提供的文件接口
  • WebGL下如何访问StreamingAssets文件夹?
    • Unity打包WebGL之后保留了StreamingAssets文件夹,但是使用Application.streamingAssetsPath是无法读取到StreamingAssets文件路径的。为了能正确读取到本地StreamingAssets文件的数据,我们需要使用到UnityWebRequest类(Unity老版本使用WWW)。Directory.Exists访问的是磁盘路径,”网址+端口+文件路径”会组装出URL路径,所以访问不了。
  • WebGL如何访问Application.PersistentDataPath?
    • WebGL下persistentDataPath为 “/Idbfs/{md5 code}”,是浏览器用于缓存的虚拟路径,使用System.IO.File接口进行访问,不能使用UnityWebRequest(至少我试过不行)。访问路径例如“/Idbfs/{md5 code}/{filePath}”
  • 微信文件API,ReadFileSync和WriteFileSync写入二进制文件坑点
    • 坑点1:WriteFileSync时,Encoding需要传入base64。使用ReadFileSync读出时也要使用base64,因为接口以字符串形式返回读取的二进制文件,base64能保证二进制不被截断(不会出现’0x00’)
    • 坑点2:ReadFileSync以字符串形式返回读取的二进制文件,即使已经传递了base64作为Encoding,但其返回的string内容仍然是以base64编码的字节,仍然需要使用System.Convert.FromBase64String(string)转换从而得到bytes

    • 25.1.10更新,1.7日的版本貌似修复了使用“binary”读取字节流的问题,正好那几天被这个问题卡了好久(;-;)
  • 微信开发者工具ErrorLog:Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!


  • 微信开发者工具渲染进程超出内存限制
    • 只是开发者工具的内存超过了而已,并不代表游戏有内存泄漏,将内存限制设置较大即可


有用的链接

#WebGL/微信小游戏


#抖音小游戏


#IL2CPP



#未仔细阅读但之后可能有用


本文由作者按照 CC BY 4.0 进行授权

热门标签