ウェブブラウザーで実行するように設計された Unity のウェブアプリケーションには、ウェブテクノロジーによる制限が課せられます。ウェブプラットプラットフォーム用のアプリケーションをビルドする前に、以下の技術的な制限を確認してください。
ほとんどの一般的なデスクトップブラウザーのバージョンは、Unity ウェブコンテンツをサポートしていますが、ブラウザーによってサポートレベルが異なることに注意してください。
ウェブビルドにおいては、プラットフォーム自体の制約により以下の機能を使用できない、または制限されている場合があります。
ウェブビルドのデバッグは Visual Studio ではサポートされていません。詳細は、ウェブビルドのデバッグとトラブルシューティングを参照してください。
ブラウザーでファイルシステムへのアクセスが制限されているため、ウェブビルドでは Unity Cache と Caching Scripting API をサポートしていません。アセットデータおよび AssetBundles に対するネットワークリクエストは、代わりにブラウザーキャッシュへキャッシュされます。ウェブのキャッシュ動作を参照してください。
JavaScript にスレッドサポートがないため、スレッドはサポートされていません。これはパフォーマンス向上のための Unity の内部的なスレッド使用にも、スクリプトコードやマネージ DLL でのスレッド使用にも適用されます。基本的に、System.Threading 名前空間の要素はサポートされません。
ウェブプラットフォームでサポートしていないネットワーク機能がいくつかあります。
ブラウザーではセキュリティ保護のため、ネットワーク機能で IP ソケットに直接アクセスすることができません。詳細は、ウェブネットワークを参照してください。
System.Net 名前空間内の .NET ネットワーククラスはサポートされません。
ウェブプラットフォームは、ブラウザー内のセキュリティ制限のためネイティブソケットアクセスをサポートしていません。したがって、ウェブでは ICMP ping や UnityEngine.Ping などの機能もサポートしません。
WebGL グラフィックス API のウェブプラットフォームには、いくつかの制限がありますが、これは OpenGL ES グラフィックスライブラリの機能に基づいています。詳細については、ウェブグラフィックスを参照してください。
ウェブビルドでは、Web Audio API に基づいてオーディオにカスタムバックエンドを使用しますが、これは基本的なオーディオ機能しかサポートしません。詳細については、ウェブのオーディオを参照してください。
ウェブは AOT プラットフォームであるため、System.Reflection.Emit を使用したコードの動的生成はできません。これは、他のすべての IL2CPP プラットフォーム、iOS、ほとんどのコンソールで同じです。
Unity はネイティブ C/C++ コードのマルチスレッドサポートを提供していますが、WebAssembly の制限により、ウェブプラットプラットフォームはまだ C# マルチスレッドをサポートしていません。つまり、ウェブプラットプラットフォームを使用してビルドされたアプリケーションは、単一の C# スレッドで実行する必要があります。
ノート:
ウェブプラットフォームは、Web Player の設定で Native C/C++ support を有効にした場合にのみ C/C++ マルチスレッドをサポートします。
ドキュメントが安全なコンテキスト内にある場合、ウェブプラットプラットフォームはマルチスレッドをサポートします。
以下の HTTP レスポンスヘッダーは、サーバーによって設定する必要があります。
ウェブプラットフォームで複雑な非同期タスクを実行するために推奨される方法は、コルーチンを使用することです。詳細については、コルーチンのドキュメントを参照してください。
以下の要因によって、マルチスレッドのサポートが制限されています。
ウェブプラットフォームは WebAssembly を使用しています。これは、Unity コードをウェブブラウザーで安全かつ効率的に実行するためのバイトコード形式です。ウェブブラウザーは、ネイティブの WebAssembly スタックへの直接アクセスをブロックし、安全で分離された環境でコードを実行するように設計されています。ウェブガベージコレクターは、他のプラットフォームで複数のフレームにわたってインクリメンタルに実行されるのとは異なり、各フレームの終了時に 1 回だけ実行されるため、これはマルチスレッドのガベージコレクションに影響します。
バックグラウンドワーカーは、ウェブ上で互いに独立して並列にコードを実行します。ネイティブプラットフォームでは、メインスレッドが他のスレッドに同期して信号を送り、ガベージコレクションを一時停止できます。ウェブではこの同期シグナリングがサポートされていないため、WebAssembly でコンパイルされた C# コードを複数のスレッドで実行することができません。
Unity は、基本機能のみを備えたウェブサーバーを使用して、ビルドと実行 (メニューで Edit > Build Profiles > Build and Run を選択) で作成されたウェブビルドをホストします。
このサーバーはデータ キャッシュをサポートしてないため、以下のものに影響します。
.data ファイル (AssetBundles または Addressables を使用しないビルドのすべてのシーンとアセットを含みます)。