セキュリティ上の理由で、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 にあります。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.