# ウェブネットワーク

> How to use networking in Web.

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

* [UnityWebRequest](/engine/6000.0/manual/scripting/object-oriented-development/web-request.md) クラスの使用
* [Unity Netcode ネットワークパッケージの使用](#UsingNetcode)

## ウェブでの UnityWebRequest クラスの使用##use-the-unitywebrequest-class-in-web

Unity はウェブでの [UnityWebRequest](/engine/6000.0/script-reference/unity-engine-networking/unity-web-request.md) クラスの使用をサポートしています。UnityWebRequest クラスの実装に、Unity は JavaScript Fetch API を使用します。JavaScript Fetch API はブラウザーを使用してウェブリクエストをハンドルします。そのため、クロスドメインリソースへのアクセスにセキュリティ制限があります。

Unity コンテンツをホストするサーバー以外のサーバーにウェブリクエストを送信する場合は、送信先のサーバーが Unity コンテンツを承認する必要があります。

ウェブでクロスドメインのウェブリソースにアクセスするには、アクセスしようとしているサーバーが [オリジン間リソース共有 (CORS)](https://fetch.spec.whatwg.org/#http-cors-protocol) を使用してドメインのウェブリソースを認証する必要があります。

UnityWebRequest を使用してコンテンツにアクセスしようとするときに、リモートサーバーに CORS が正しく設定されていないと、ブラウザーのコンソールに以下のようなエラーが表示されます。

```
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver.com/. This can be fixed by moving the resource to the same domain or enabling CORS.
```

サーバーは、送信する http レスポンスに Access-Control ヘッダーを加えて、どのウェブページがウェブブラウザーからその情報を読み取る権限を持っているかを示す必要があります。

Access-Control ヘッダーを追加して、Unity Web が任意のオリジンからウェブサーバー上のリソースにアクセスできるようにする方法は、以下の例を参照してください。この例では、一般的なリクエストヘッダーを使用し、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 のダウンロード**##**unitywebrequest-downloads**

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

```
while(!www.isDone) {}
```

ウェブブラウザーでは、ネットワーク転送を待機する同期ブロックコードの実行は許可されません。したがって、同期スタイルの UnityWebRequest を実行する必要がある場合は、[コルーチン](/engine/6000.0/manual/scripting/object-oriented-development/coroutines.md)と yield ステートメントを使用してダウンロードが終了するのを待ちます。詳細については、[UnityWebRequest を使用したコルーチンの例](/engine/6000.0/manual/scripting/object-oriented-development/web-request/hlapi.md) を参照してください。

## Unity Netcode ネットワークパッケージの使用##use-the-unity-netcode-networking-packagescrollpoint-id=usingnetcode-/

セキュリティ上の制限により、ウェブブラウザーは TCP や UDP ソケットに直接アクセスすることはできません。代わりに、ウェブプラットフォームをサポートする Unity Netcode ネットワークパッケージを使用できます。詳細については、ドキュメント [About Netcode for GameObjects](https://docs-multiplayer.unity3d.com/netcode/current/about/) (Unity Multiplayer Networking) を参照してください。

ウェブブラウザーのネットワーク標準の詳細については、以下を参照してください。

* [The WebSocket Protocol](https://datatracker.ietf.org/doc/html/rfc6455) (Datatracker)
* [WebRTC: Real-Time Communication in Browsers](https://www.w3.org/TR/webrtc/) (W3)
* [WebTransport](https://www.w3.org/TR/webtransport/) (W3)

## ウェブネットワークの制限##limitations-of-web-networking

ウェブプラットフォームがサポートしないネットワーク機能がいくつかあります。

### .NET ネットワーククラスの非サポート##no-support-for-.net-networking-classes

JavaScript コードはネットワーク接続を実装するためのインターネットプロトコル (IP) ソケットに直接アクセスできないため、ウェブプラットフォーム内で .NET ネットワーククラスを使用することはできません。具体的には、ウェブは `System.Net` 名前空間内の .NET クラスをサポートしません。

### ネイティブソケットアクセスの非サポート##no-support-for-native-socket-access

ウェブプラットフォームは、ブラウザー内のセキュリティ制限により、ネイティブソケットアクセスをサポートしていません。したがって、ウェブは [UnityEngine.Ping](/engine/6000.0/script-reference/unity-engine/ping.md) (ICMP) などの機能もサポートしません。
