Version: 2021.2
言語: 日本語
WebGL の入力
WebGL プロジェクトのビルドと実行

WebGL のネットワーク

WebGL でネットワークを利用するには、以下の 2 つの方法があります。

任意で、JavaScript の WebSockets や WebRTC を使用して、独自のネットワークを実装することができます。JavaScript のコードはネットワーク接続を実装するための IP ソケットに直接アクセスできないため、.NET のネットワーククラスは使用できないことに注意してください。

このページでは、WebGL でネットワークを利用する際のガイドラインを紹介します。

WebGL での UnityWebRequest クラスの使用

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": "*",

UnityWebRequest のダウンロード

以下のような、UnityWebReqest のダウンロードをブロックするコードは使用しないでください。

while(!www.isDone) {}

スレッドをブロックして UnityWebRequest のダウンロードが終了するのを待つことはできません。それを行うと、アプリケーションがフリーズしてしまうからです。WebGL はシングルスレッドであり、JavaScript の fetch API は非同期であるため、ブラウザーに制御を戻さないとダウンロードが終了しない可能性があります。代わりに、Coroutine と yield ステートメントを使用して、ダウンロードが終了するのを待ちます。詳細については、UnityWebRequest を使ったコルーチンの例 を参照してください。

Unity Multiplayer の使用

Unity Multiplayer は、WebSockets プロトコルによる通信を可能にします。詳しくは、NetworkServer.useWebSockets を参照してください。

JavaScript の WebSocket またはWebRTC の使用

WebGL では IP ソケットに直接アクセスすることはできませんが、WebSockets や WebRTC (ブラウザーでサポートされている最も一般的な 2 つのネットワークプロトコル) を使ってこれを回避できます。WebSockets は広くサポートされており、WebRTC はブラウザー間のピアツーピア接続と信頼性の低い接続を可能にします。Unity には、WebSockets や WebRTC を使用できるビルトインの API はありませんが、JavaScript プラグイン を使って実装することができます。WebSocket ネットワークを実装するプラグインは、Unity Asset Store で見つけることができます。

WebGL の入力
WebGL プロジェクトのビルドと実行