セキュリティ上の理由で、Javascript のコードは IP ソケットに直接アクセスしてネットワーク接続を実装することはできません。結果、.NET にあるネットワーククラス(例: System.Net
名前空間のすべて、特に System.Net.Sockets
)は WebGL で動作しません。同じ理由で Unity の古い UnityEngine.Network.*
クラスも WebGL 用にビルドしたときには動作しません。
WebGL でネットワーク機能が必要な場合、現段階では Unity の WWW
や UnityWebRequest
クラスを使用するか、WebGL をサポートする新しい Unity Networking 機能を使用するか、または、Javascript の WebSocket や WebRTC を使用して独自のネットワークを実装する必要があります。
WWW と UnityWebRequest クラスは、WebGL でサポートされています。それらは、WWW のリクエストをブラウザーがハンドリングして、Javascript の XMLHttpRequest
クラスを使用して実装されます。そのためクロスドメインというセキュリティ上の問題でいくつかの制限があります。WebGL のコンテンツが置かれているサーバーから(URL が異なる)別のサーバーへと WWW リクエストを行う場合、アクセスしようとしている別のサーバー上でそのリクエストが認証されなければいけません。WebGL でクロスドメインの問題を解決するには CORS (Cross-Origin Resource Sharing) を使用して承認を行う必要があります。
アクセス先のサーバーで CORS の設定が行われずに WWW
や UnityWebReqest
を使用してコンテンツにアクセスすると、ブラウザのコンソールに以下のようなエラーログが出力されます。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver.com/. この問題はリソースを同じドメインに移すか、 CORS を使用可能にすると修正されます
CORS の詳細は こちら を参照してください。基本的には、サーバーは Access-Control
ヘッダーを送信する http レスポンスに追加する必要があります。それらは、ウェブページがサーバーのコンテンツへのアクセスを許可されていることをブラウザーに伝えます。ここにヘッダー設定の例があります。これによって、Unity WebGL は、一般的なリクエストヘッダーで http の GET
、POST
、OPTIONS
メソッドを使って、どこからでもウェブサーバーのリソースにアクセスすることができます。
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Headers": "Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Origin": "*",
CORS の詳細 7.1.1 によると WWW.responseHeaders の使用は実際のレスポンスヘッダーのサブセットに制限されることに注意してください。
また、XMLHttpRequest はデータのストリーミングを許可しないので、WebGL の WWW クラスではデータのダウンロードが終了した後にデータを処理するようにしてください(他のプラットフォームのようにダウンロードしながら AssetBundle を解凍やロードを行うことはできません)。
以下のような、WWW や WebRequest ダウンロードの邪魔をするコードを使用しないでください。
while(!www.isDone) {}
Unity WebGLでは、WWW や WebRequest のダウンロードをブロックすることはできません。WebGL はシングルスレッドであるため、また、JavaScript の XMLHttpRequest クラスは非同期であるため、ブラウザに制御を戻さない限り、ダウンロードは終了しません。代わりに、コンテンツがデッドロックします。ダウンロードをブロックしないで、コルーチン と yield 文を使用して、ダウンロードが完了するまで待ちます。
Unity Network 機能 は WebSocket プロトコルを経由して通信を有効にして WebGL をサポートします。Networking.NetworkManager.useWebSockets を参照してください。
上記で書いたように、WebGL で IP ソケットに直接アクセスすることはできません。ただし、WWW クラスでできる事以上のネットワーク機能を扱いたい場合は、ブラウザでサポートされているネットワークプロトコルである WebSocket や WebRTC を使用します。Web Socket はより幅広くサポートが行われていますが、WebRTC はブラウザと信頼性の保たれていない接続間で P2P 接続を許可します。これらのプロトコルは両方ともまだ Unity のビルトイン API として公開されていませんが、JavaScript プラグイン を使用し実装することが可能です。Unity WebGL の WebSocket ネットワークを実装するプラグインの例はAssetStore にあります。