Documentation

Unity Engine


User Manual

Script Reference

Unity Engine


Web native plug-ins for Emscripten

Web native plug-ins for Emscripten.
Read time 5 minutesLast updated 12 days ago

Unity uses the Emscripten compiler toolchain to cross-compile the Unity runtime code written in C and C++ into WebAssembly (also called Wasm). Emscripten generates small code, is load-time and memory efficient, and aims to deliver close to native speed execution.
Unity uses IL2CPP to convert the .NET game code in your C# scripts to Wasm. IL2CPP takes .NET bytecode and converts it to corresponding C++ source files, which is then compiled using Emscripten to convert your scripts to Wasm.

Targeted versions

Unity bundles the Emscripten compiler with the Web platform package, so that you don't have to manually download it. The version of Emscripten that the Unity Editor uses varies by Editor version:

Unity Version

Emscripten version

Supported native plug-in file formats

Unity 6000.5 and laterEmscripten 4.0.19-unity.a, .bc
Unity 2023.2 and laterEmscripten 3.1.38-unity.a, .bc
Unity 2022.2 and laterEmscripten 3.1.8-unity.a, .bc
Unity 2021.2 and laterEmscripten 2.0.19.6-unity.a, .bc
Unity 2019.2 to 2021.11.38.11-unity.bc
Unity 2018.4 up until Unity 2019.21.37.40-unity.bc
Unity 2018.2 up until Unity 2018.41.37.33-unity.bc
Notes:
  • The following list provides expansion for the acronyms of file formats listed in the table:
    • GNU archive file format (
      .a
      )
    • WebAssembly Object Files (
      .o
      )
    • LLVM Bitcode file format (
      .bc
      )
  • With Emscripten versions before Emscripten 2.0, Unity recommends building
    Bitcode
    plug-ins (files of type
    .bc
    ). From Emscripten 2.0 onwards, Unity recommends to build
    Wasm Object File
    plug-ins that are Wasm object files of type
    .o
    , bundled into GNU archive files of type
    .a
    .
You can determine the path to the exact version of Emscripten toolchain from the
emscripten-version.txt
located at:
C:\Program Files\Unity\Hub\Editor\<Editor version>\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emscripten-version.txt

Compile native plug-ins with Emscripten

If you're creating native C/C++ plug-ins for your Unity application, you can either bundle the C/C++ code with your project (refer to Native plug-ins) or build the native code to a plug-in archive ahead-of-time with the Emscripten compiler toolchain.
If you choose to build plug-in code in advance, use the Emscripten compiler toolchain. To ensure LLVM binary format compatibility, the version of Emscripten that's used to compile the plug-ins must match the version of Emscripten that Unity uses.
Typically, plug-ins are compiled to a static library archive format. For versions before Unity 2021.2 (Emscripten 2.0), LLVM Bitcode file format (
.bc
) is the preferred plug-in format.
From Unity 2021.2, the preferred plug-in format is GNU archive file format (
.a
) that contain WebAssembly Object Files (
.o
). Although, earlier LLVM Bitcode .bc plug-in files are still supported, using them might have a negative impact to compilation times.
Note
When migrating a native plug-in from one Unity version to a version that uses a different version of Emscripten, the recommended best practice is to recompile the Unity plug-in from source, because the LLVM compiler project doesn't guarantee binary compatibility of build artifact files across compiler versions.

Emscripten build flags

When you compile your C/C++ code, include specific build flags to ensure compatibility with certain Player Settings (menu: Edit >
Project Settings

?

> Player).
Without these flags, the plug-in might not link correctly with the code generated by Unity.

Unity Player Setting

Required Emscripten build flags

Enable Exceptions set to None
-fno-exceptions
Target WebAssembly 2023 enabled
-msimd128
-fwasm-exceptions
-mbulk-memory
-mnontrapping-fptoint
-msse4.2
-sSUPPORT_LONGJMP=wasm
Enable C/C++ Native Multithreading enabled
-pthread
Maximum Memory Size set to more than 4 GBSame flags as Target WebAssembly 2023, plus
-sMEMORY64=1
Note
Setting Maximum Memory Size to more than 4 GB enables WebAssembly 64-bit support, which also enables Target WebAssembly 2023.

Support different Player Settings in a native plug-in

To support different Player Settings in a native plug-in, compile multiple versions of the plug-in using the Emscripten build flags and add them to your project.
You can then use the Inspector to configure which plug-in version Unity includes in the build, depending on the active Player Settings. For each native plug-in, the Inspector provides the following Web platform settings:

Setting

Description

Minimum Unity Version and Maximum Unity VersionSpecify the range of Unity versions the plug-in is compatible with. This is useful when you need to support multiple Unity versions that have breaking changes in browser interaction code. Add a separate version of the plug-in for each compatible range, and Unity selects the correct one at build time. Leave empty if the plug-in is compatible with all Unity versions.
Minimum Emscripten Version and Maximum Emscripten VersionSpecify the range of Emscripten versions the plug-in is compatible with. Because different Unity versions bundle different Emscripten versions, use this setting to ensure binary compatibility. Leave empty if the plug-in is compatible with all Emscripten versions. For a list of Emscripten versions used in each Unity version, refer to Targeted versions.
WebAssembly ArchitectureSelect whether the plug-in targets Wasm (32-bit) or Wasm64 (64-bit). Unity includes the plug-in only when the selected architecture matches the project's Maximum Memory Size setting. Projects with a maximum memory size greater than 4 GB use the 64-bit architecture.
Enable ExceptionsSelect whether the plug-in requires exception support to be enabled or disabled. For example, a plug-in compiled with
-fno-exceptions
is incompatible with exception support. Select Any Configuration if the plug-in works with both settings.
Enable Native C/C++ MultithreadingSelect whether the plug-in requires native C/C++ multithreading to be enabled or disabled. For example, a plug-in compiled with
-pthread
requires multithreading to be enabled. Select Any Configuration if the plug-in works with both settings.
Target WebAssembly 2023Select whether the plug-in requires WebAssembly 2023 features to be enabled or disabled. For example, a plug-in compiled with
-msimd128
and
-fwasm-exceptions
requires WebAssembly 2023 to be enabled. Select Any Configuration if the plug-in works with both settings.
Unity automatically selects the correct plug-in variant at build time based on the active Player Settings. If multiple plug-ins match the same configuration, or no plug-in matches, Unity reports an error.

Settings for a native plug-in on the Web platform.

Additional resources