Unity使用 Emscripten 编译器工具链将 Unity 运行时代码(用 C 和 C++ 编写)交叉编译成 WebAssembly(也称为 Wasm)。Emscripten 会生成小代码,具有加载时间和内存效率,旨在提供接近原生速度的执行。
Unity 使用 IL2CPP 将 C# 脚本中的 .NET 游戏代码转换为 Wasm。IL2CPP 接受 .NET 字节码并将其转换为相应的 C++ 源文件,然后使用 Emscripten 进行编译以将脚本转换为 Wasm。
Unity 将 Emscripten 编译器与 Web 平台包捆绑在一起,因此不必手动下载。编辑器使用的 Emscripten 版本因编辑器版本而异:
| Unity 版本 | Emscripten 版本 | 支持的原生插件文件格式 |
|---|---|---|
| Unity 2023.2 及更高版本 | Emscripten 3.1.38-unity | .a、.bc |
| Unity 2022.2 及更高版本 | Emscripten 3.1.8-unity | .a、.bc |
| Unity 2021.2 及更高版本 | Emscripten 2.0.19.6-unity | .a、.bc |
| Unity 2019.2 到 2021.1 | 1.38.11-unity | .bc |
| Unity 2018.4 直到 Unity 2019.2 | 1.37.40-unity | .bc |
| Unity 2018.2 直到 Unity 2018.4 | 1.37.33-unity | .bc |
注意:
下表提供了上表中列出的文件格式缩写的扩展名:
.a).o).bc)对于 Emscripten 2.0 之前的 Emscripten 版本,Unity 建议构建 Bitcode 插件(.bc 类型的文件)。从 Emscripten 2.0 开始,Unity 建议构建 Wasm Object File 插件,这些插件是 .o 类型的 Wasm 对象文件,捆绑到 .a 类型的 GNU 存档文件中。
您可以从位于以下位置的 emscripten-version.txt 确定 Emscripten 工具链的确切版本的路径:
C:\Program Files\Unity\Hub\Editor\<Editor version>\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emscripten-version.txt
如果要为 Unity 应用程序创建原生 C/C++ 插件,可将 C/C++ 代码与项目捆绑(请参阅原生插件),或使用 Emscripten 编译器工具链提前将原生代码构建到插件存档中。
如果选择预先构建插件代码,则应使用 Emscripten 编译器工具链。为了确保 LLVM 二进制格式兼容性,用于编译插件的 Emscripten 版本必须与 Unity 使用的 Emscripten 版本匹配。
通常,插件会编译为静态库存档格式。对于 Unity 2021.2 (Emscripten 2.0) 之前的版本,LLVM 位码文件格式 (.bc) 是首选插件格式。
从 Unity 2021.2 开始,首选插件格式是包含 WebAssembly 对象文件 (.o) 的 GNU 存档文件格式 (.a)。虽然仍然支持早期的 LLVM Bitcode .bc 插件文件,但使用这些文件可能会对编译时间产生负面影响。
注意:将原生插件从一个 Unity 版本迁移到使用不同版本的 Emscripten 时,Unity 建议从源代码重新编译 Unity 插件,因为 LLVM 编译器项目不能保证构建工件文件在不同编译器版本的二进制兼容性。
如果编译 WebAssembly 对象文件以便与 WebAssembly 2023 或 C/C++ 多线程结合使用,请包含以下 Emscripten 构建标志。如果没有这些标志,代码可能无法与使用 Unity 构建的代码正确链接。
| 目标 | 必需的 Emscripten 构建标志 |
|---|---|
| WebAssembly 2023 |
-msimd128 -fwasm-exceptions -mbulk-memory -mnontrapping -fptoint -msse4.2 -sWASM_BIGINT -sSUPPORT_LONGJMP=wasm
|
| C/C++ 原生多线程 | -pthread |