UnityWebRequest入門資料

― UnityでのHTTP通信の基礎と実践 ―


1. UnityWebRequestとは

UnityWebRequest は、Unityにおけるネットワーク通信(HTTP通信)を行うためのクラスです。Web APIと通信したり、外部ファイル(JSON、画像、音声など)を取得・送信したりできます。

旧 WWW クラスの後継であり、柔軟かつ安全で高機能なAPIです。


2. 主な用途

  • ランキングやログイン情報などの REST API 通信
  • Webサーバーからの画像や音声のダウンロード
  • JSON形式のデータのやり取り
  • クラウドサービス(Firebase, PlayFab, Supabaseなど)との連携
  • アップロード(スクリーンショット、ログ、ユーザーデータなど)

3. 基本的な使い方

3.1 GETリクエスト(データ取得)

IEnumerator GetRequest(string url)
{
    UnityWebRequest request = UnityWebRequest.Get(url);
    yield return request.SendWebRequest();

    if (request.result == UnityWebRequest.Result.Success)
        Debug.Log(request.downloadHandler.text);
    else
        Debug.LogError(request.error);
}

3.2 POSTリクエスト(フォーム送信)

IEnumerator PostRequest(string url)
{
    WWWForm form = new WWWForm();
    form.AddField("user", "Yamada");
    form.AddField("score", 1000);

    UnityWebRequest request = UnityWebRequest.Post(url, form);
    yield return request.SendWebRequest();

    if (request.result == UnityWebRequest.Result.Success)
        Debug.Log("Success");
    else
        Debug.LogError(request.error);
}

3.3 JSON送信(UploadHandlerRaw)

IEnumerator PostJson(string url, string json)
{
    var request = new UnityWebRequest(url, "POST");
    byte[] body = System.Text.Encoding.UTF8.GetBytes(json);
    request.uploadHandler = new UploadHandlerRaw(body);
    request.downloadHandler = new DownloadHandlerBuffer();
    request.SetRequestHeader("Content-Type", "application/json");

    yield return request.SendWebRequest();

    if (request.result == UnityWebRequest.Result.Success)
        Debug.Log(request.downloadHandler.text);
    else
        Debug.LogError(request.error);
}

4. よく使うプロパティ・メソッド一覧

機能説明
UnityWebRequest.Get(url)HTTP GETリクエストの送信
UnityWebRequest.Post(url, f)フォームデータのPOST送信
UploadHandlerRawバイナリまたはJSONデータのアップロードに使用
DownloadHandlerBufferレスポンスデータをバッファとして受信(テキスト用途)
SetRequestHeader()HTTPヘッダーの設定(例:APIキー、Content-Type)
responseCodeHTTPステータスコード(例:200, 404)
result成否を示す列挙値(Success, ConnectionErrorなど)

5. 注意点とベストプラクティス

  • 通信処理は 必ず非同期(コルーチンやasync/await)で行う
  • エラー処理は request.result や responseCode を使って確認
  • WebGLの場合、CORS制限(クロスドメインポリシー)に要注意
  • 通信結果をUIと連動させる際は、別スレッド処理に留意
  • 長時間通信には進捗表示とタイムアウト対策を行う

6. 発展的な活用

利用例実装ヒント
ダウンロード進捗表示request.downloadProgress で進捗率を取得可能
テクスチャ画像の取得DownloadHandlerTexture.GetContent(request) を使用
SSL証明書の回避(開発用途)CertificateHandler をオーバーライド
通信ログの保存request.uploadHandler.data や downloadHandler.text をログ出力

7. 関連リンク・参考資料


8. 画像ダウンロードの具体例(Texture2D)

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using UnityEngine.UI;

public class ImageLoader : MonoBehaviour
{
    public string imageUrl = "https://example.com/image.png";
    public RawImage targetImage;

    void Start()
    {
        StartCoroutine(DownloadImage(imageUrl));
    }

    IEnumerator DownloadImage(string url)
    {
        UnityWebRequest request = UnityWebRequestTexture.GetTexture(url);
        yield return request.SendWebRequest();

        if (request.result == UnityWebRequest.Result.Success)
        {
            Texture2D tex = DownloadHandlerTexture.GetContent(request);
            targetImage.texture = tex;
        }
        else
        {
            Debug.LogError("Failed to download image: " + request.error);
        }
    }
}
  • UnityWebRequestTexture.GetTexture() で画像取得
  • RawImage や Renderer.material.mainTexture に貼り付け可能

9. WebGL向け制限と対策

制限

問題点説明
CORS制限サーバー側で Access-Control-Allow-Origin ヘッダーが必要
HTTPS必須HTTP通信はブロックされる可能性が高い(特にChrome)
file:// 非対応ローカルファイル読み込み不可
キャッシュ制御ブラウザにキャッシュされるため、更新が反映されにくい場合あり

対策

対策内容解説
サーバーにCORS対応を追加Access-Control-Allow-Origin: * を設定(Apache/Nginx)
HTTPS環境でホスティングサーバーおよびAPIのURLをすべてHTTPSに統一
ローカル検証はローカルサーバー使用http://localhost で実行(Live Serverなど)
キャッシュ無効化設定URLにパラメータを付ける(例: ?t=timestamp)などで対応

10. まとめ

UnityWebRequestは、Unityでの外部通信機能を担う強力なクラスです。基本的なGET/POSTだけでなく、JSONや画像のやりとり、WebGL環境への対応など、さまざまな用途に柔軟に対応できます。

エラーハンドリングやセキュリティを考慮した設計とともに、ネットワーク機能の構築に活用してください。

Unity,通信

Posted by hidepon