WebGL でネットワークを利用するには、以下の 2 つの方法があります。
UnityWebRequest クラス
Unity Multiplayer (previously UNet)
Note: UNet is a deprecated solution, and a new Multiplayer and Networking Solution (MLAPI) is under development.
任意で、JavaScript の WebSockets や WebRTC を使用して、独自のネットワークを実装することができます。JavaScript のコードはネットワーク接続を実装するための IP ソケットに直接アクセスできないため、.NET のネットワーククラスは使用できないことに注意してください。
このページでは、WebGL でネットワークを利用する際のガイドラインを紹介します。
Unity は、WebGL でUnityWebRequest クラスをサポートします。UnityWebRequest クラスを実装するために、Unity は JavaScript Fetch API を使用します。この API は、ブラウザーを使ってウェブリクエストを処理します。このため、クロスドメイン (ドメインをまたぐ) のリソースへのアクセスにはセキュリティ上の制約があります。
Unity コンテンツをホストするサーバー以外のサーバーにウェブリクエストを送信する場合は、送信先のサーバーが Unity コンテンツを承認する必要があります。
WebGL でクロスドメインのウェブリソースにアクセスするには、アクセスしようとしているサーバーが オリジン間リソース共有 (CORS) を使用してドメインのウェブリソースを認証する必要があります。
UnityWebRequest を使用してコンテンツにアクセスしようとするときに、リモートサーバーに CORS が設定されていないと、ブラウザーのコンソールに以下のようなエラーが表示されます。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver.com/. この問題はリソースを同じドメインに移すか、 CORS を使用可能にすると修正されます
サーバーは、送信する http レスポンスに Access-Control ヘッダーを加えて、どのウェブページがウェブブラウザーからその情報を読み取る権限を持っているかを示す必要があります。
Access-Control ヘッダーを加えて、Unity WebGL が任意のオリジンからウェブサーバー上のリソースにアクセスできるようにする方法は、次の例を参照してください。この例では、一般的なリクエストヘッダーを含み、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": "*",
以下のような、UnityWebReqest のダウンロードをブロックするコードは使用しないでください。
while(!www.isDone) {}
スレッドをブロックして UnityWebRequest のダウンロードが終了するのを待つことはできません。それを行うと、アプリケーションがフリーズしてしまうからです。WebGL はシングルスレッドであり、JavaScript の fetch
API は非同期であるため、ブラウザーに制御を戻さないとダウンロードが終了しない可能性があります。代わりに、Coroutine と yield ステートメントを使用して、ダウンロードが終了するのを待ちます。詳細については、UnityWebRequest を使ったコルーチンの例 を参照してください。
Unity Multiplayer は、WebSockets プロトコルによる通信を可能にします。詳しくは、NetworkServer.useWebSockets を参照してください。
WebGL では IP ソケットに直接アクセスすることはできませんが、WebSockets や WebRTC (ブラウザーでサポートされている最も一般的な 2 つのネットワークプロトコル) を使ってこれを回避できます。WebSockets は広くサポートされており、WebRTC はブラウザー間のピアツーピア接続と信頼性の低い接続を可能にします。Unity には、WebSockets や WebRTC を使用できるビルトインの API はありませんが、JavaScript プラグイン を使って実装することができます。WebSocket ネットワークを実装するプラグインは、Unity Asset Store で見つけることができます。