# Emscripten 用のウェブネイティブプラグイン

> Web native plug-ins for Emscripten.

Unity では [Emscripten コンパイラー](https://emscripten.org/) ツールチェーンを使用して Unity ランタイムコード (C および C++ で記述されています) を [WebAssembly](https://webassembly.org/) (Wasm とも呼ばれます) にクロスコンパイルしています。Emscripten は小さなコードを生成し、ロード時間とメモリ効率に優れ、ネイティブスピードに近い実行速度を目指しています。

Unity は [IL2CPP](/engine/6000.0/manual/scripting/compilation-and-code-reload/backends/il2cpp.md) を使用して、C# スクリプトの .NET ゲームコードを Wasm に変換します。IL2CPP は .NET バイトコードを取得し、それを対応する C++ ソースファイルに変換し、Emscripten を使用してスクリプトを Wasm に変換します。

## ターゲットとなるバージョン##targeted-versions

Unity は Emscripten コンパイラーを Web platform パッケージにバンドルしているため、手動でダウンロードする必要はありません。エディターが使用する 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                         |

**注:**

* 以下のリストは、上の表にリストされているファイル形式の略語の意味を示しています。

  * GNU アーカイブファイル形式 (`.a`)
  * WebAssembly Object File (`.o`)
  * LLVM Bitcode ファイル形式 (`.bc`)

* Emscripten 2.0 より前のバージョンの Emscripten では、Unity は `Bitcode` プラグイン (`.bc` タイプのファイル) のビルドを推奨しています。Emscripten 2.0 以降では、Unity は `Wasm Object File` プラグインのビルドを推奨しています。これは、`.o` タイプの Wasm オブジェクトファイルで、`.a` タイプの GNU アーカイブファイルにバンドルされています。

Emscripten ツールチェーンの正確なバージョンへのパスは、以下の場所にある `emscripten-version.txt` から確認できます。

```
C:\Program Files\Unity\Hub\Editor\<Editor version>\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emscripten-version.txt
```

## Emscripten によるネイティブプラグインのコンパイル##compile-native-plug-ins-with-emscripten

Unity アプリケーション用のネイティブ C/C++ プラグインを作成する場合は、C/C++ コードをプロジェクトにバンドルすることも ([ネイティブプラグイン](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native.md) を参照)、Emscripten コンパイラーツールチェーンを使用してネイティブコードを事前にプラグインアーカイブにビルドすることもできます。

事前にプラグインコードをビルドする場合は、Emscripten コンパイラーツールチェーンを使用する必要があります。[LLVM バイナリ形式](https://llvm.org/) 互換性を確保するため、プラグインのコンパイルに使用される Emscripten のバージョンは、Unity が使用する Emscripten のバージョンと一致する必要があります。

通常、プラグインは静的ライブラリアーカイブ形式にコンパイルされます。Unity 2021.2 (Emscripten 2.0) より前のバージョンでは、LLVM Bitcode ファイル形式 (`.bc`) が推奨されるプラグイン形式です。

Unity 2021.2 以降では、推奨されるプラグイン形式は、WebAssembly Object File (`.o`) を含む GNU アーカイブファイル形式 (`.a`) です。以前の LLVM Bitcode .bc プラグインファイルは引き続きサポートされていますが、使用するとコンパイル時間に悪影響を及ぼす可能性があります。

**注意**ネイティブプラグインをある Unity バージョンから異なるバージョンの Emscripten を使用する Unity バージョンに移行する場合、LLVM コンパイラープロジェクトはコンパイラーバージョン間のビルドアーティファクトファイルのバイナリ互換性を保証しないため、Unity では Unity プラグインをソースから再コンパイルすることを推奨しています。

### Emscripten ビルドフラグ##emscripten-build-flags

WebAssembly 2023 または C/C++ マルチスレッドで使用する WebAssembly Object File をコンパイルする場合は、以下の Emscripten ビルドフラグを追加します。これらのフラグがないと、コードは Unity でビルドされたコードと正しくリンクしない可能性があります。

| **ターゲット**          | **必須の Emscripten ビルドフラグ**                                                                                                      |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------ |
| WebAssembly 2023   | `-msimd128` `-fwasm-exceptions` `-mbulk-memory` `-mnontrapping` `-fptoint` `-msse4.2` `-sWASM_BIGINT` `-sSUPPORT_LONGJMP=wasm` |
| C/C++ ネイティブマルチスレッド | `-pthread`                                                                                                                     |

## その他の参考資料##additional-resources:

* [ネイティブプラグイン](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native.md)
