セキュリティ上の理由で、Javascript のコードは IP ソケットでネットワーク接続を実装することはできません。結果、.NET にあるネットワーククラス(例: System.Net にあるもの、特に System.Net.Sockets
)は WebGL で動作しません。同じ理由で Unity の古い UnityEngine.Network.*
クラスも WebGL でビルドしたときには動作しません。
WebGL でネットワーク機能が必要な場合、現段階では WWW
や UnityWebRequest
クラスを使用するか、WebSocket、Javascript の 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(Cross-Origin Resource Sharing)は ここ にドキュメントがあります。基本的には、サーバーへのアクセスを許可する Web ページの URL を HTTP のレスポンスの Access-Control ヘッダーに追加する必要があります。以下は、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 を参照してください。
上記で書いたように、IP ソケットで直接アクセスすることはできません。ですが、WWW クラスでできる事以上のネットワーク機能を扱いたい場合は、ブラウザでサポートされている WebSocket や WebRTC を使用することで可能になります。Web Socket は幅広いサポートが行われていますが、WebRTC はブラウザと信頼性の保たれていない接続間で P2P 接続を許可します。これらのプロトコルは両方ともまだ Unity の API として公開されていませんが、JavaScript プラグインで使用し実装することが可能です。Unity の WebGL においての WebSocket の実装サンプルはAssetStoreにあります。