0%

前言

Unity使用WebAssembly(wasm)技术将引擎代码和业务代码编译到WebGL平台上解析运行,截止目前2023年,PC浏览器对webgl的支持也越来越兼容普及,并且wasm具有可移植、体积小、加载快等特点,应用运行能接近原生的体验。

为应对项目组拓展海外市场的发展战略,因为海外用户使用PC玩游戏比较多,所以先预研一下发布WebGL平台的整体流程。

这里使用已经上线的项目——食物语来实践,这样遇到的问题比较有代表性。

顺便打下广告,食物语是一项集中华传统美食文明和二次元风格于一体的女性向养成卡牌游戏,对美食和二次元感兴趣的同学,非常有必要下载玩玩~~

阅读全文 »

WebGL浏览器兼容性

  • 支持主流的桌面浏览器,但不同浏览器的不同版本支持程度和性能不一。
  • 不支持移动设备,但在高端的移动设备上仍可以运行,瓶颈是内存。

各浏览器webgl兼容性表

WebGL支持能力

能力 支持程度 解决方案
多线程 不支持 不支持System.Threading,将多线程代码替换成异步等方式实现
网络系统 需调整 不支持 System.Net 接口,HTTP使用UnityWebRequest,TCP使用 WebSocket 通信替代(UnityWebSocket 插件)
音频 支持 仅基于Web Audio API实现基础功能,不支持压缩和自动播放,不支持Fmod
图形API 支持 基于OpenGL ES图形库功能,WebGL 1.0 匹配 OpenGL ES 2.0 ,WebGL 2.0 匹配 OpenGL ES 3.0
动态生成代码 不支持 WebGL是AOT平台,不支持C#反射等动态代码方案
文件系统 需调整 PlayerPrefs、Unity Local储存文件,存在PresistetDataPath下的文件会储存进IndexedDB,IndexedDB无容量限制
Lua脚本 支持 支持使用ToLua
三方库 需调整 C#三方库不能包含System.Threading、System.Net、System.Reflection等接口

浏览器平台兼容性实测

将打出的WebGL包放在各个浏览器运行测试

浏览器 测试版本 运行情况
Google Chrome 108.0.5359.125(正式版本) (64 位) 1.各个模块运行基本正常 2.fmod效果音刚播放时噪音有点大 3.fmod背景音乐偶尔进入界面时未播放,像是没有触发,切换界面回来才会播,像是业务逻辑未兼容好的问题 4.输入框捕获不到中文输入
Microsoft Edge 108.0.1462.54 (正式版本) (64 位) 运行情况跟Chrome相似
Mozila Firefox 108.0.1 (64 位) 1.fmod效果音刚播放时没有在chrome上噪音大的问题 2.画质上比chrome高清 3.输入框也捕获不到中文输入
Apple Safari pjg的mac开发机上测试 版本14.1.1 1.手机Safari访问,加载慢,能够进入到登录页,弹不起输入框,运行不久弹窗报错:WebGL builds are not supported on mobile devices. 2.fmod的效果音播放的噪声问题也存在,内存紧张是更加明显 3.pv视频播放不了,报user not allow,像是设置禁用了
360浏览器 版本号: 13.1.6380.01内核版本: 86.0.4240.198 进入主界面时报: Could not allocate memory: System out of memory! memory access out of bound,分配的内存不够 有些贴图渲染不出来一片黑
360浏览器 版本号: 13.1.6380.01内核版本: 86.0.4240.198 进入主界面时报: Could not allocate memory: System out of memory! memory access out of bound,分配的内存不够 有些贴图渲染不出来一片黑

与日志相关的配置选项

Player Setting-》Other Settings-》Stack Track

可以控制各个日志等级类型的输出,ScriptOnly只包括托管代码(C#、Lua),Full包括托管和非托管代码(C、C++)。

一般debug和release下勾ScriptOnly就够。

Publishing Settings-》Enable Exceptions

runtime下异常捕获的处理方式

  • None:不捕获,异常发生后运行不了
  • Explicitly Thrown Exceptions Only:仅捕获Thrown语句显式调用抛出的异常。
  • Full Without Stacktrace:在上面的基础上加上空引用和数组越界访问异常,并且包含非托管代码的堆栈。
  • Full With Stacktrace:在上面基础上加上捕获堆栈。

以上性能消耗由上都下递增,Full模式只建议调试时使用。

Development Build的js代码不会压缩且具有可读性,但遇到Error或Exception时可以看到堆栈跟踪。

文件位置

保存进Application.persistentDataPath目录下的文件,会被保存进IndexedDB,位于/idbfs数据库下的FILE_DATA仓库,包括PlayerPrefs、Unity local文件等,以二进制ArrayBuffer的形式存储。

所以Clogger模块的log日志可以从IndexedDB提取ArrayBuffer,然后解析成string,上报或者导出为Log文件。

IndexedDB没有容量限制。

Demo实现了WebGL导出Log文件,地址点击这里

官网脚本间的交互教程

这里提一下注意点:

1. jslib的js调用js函数

jslib里嵌入的js函数并且被C# extern导出,被编译进Build.Framework.js下的Module作用域下,在js下的函数名加了_前缀。

打算在jslib里调用同样自己封装的js函数,需要两步,C#导出以及加上_前缀。

比如SyncDB函数调用ExportLogFile函数:

编译进js的函数:

2.C#传给JS函数的参数转换

JS里拿到的string类型参数是一个内存地址,需要使用UTF8ToString来进行转换。

注意的是,不能放在回调下面FS.syncfs的回调作用域内转换,必须放在参数自己的作用域,不然后面地址回收后转出来是不准确的。