モバイルデバイスでのネットワーク Tips
ネットワーキング リファレンス

UnityWebRequest

UnityWebRequest は、Unity の WWW クラスをリプレースしたものです。HTTP リクエストを構成し、HTTP レスポンスを処理するためのモジュラーシステムを提供します。UnityWebRequest システムの第一目標は、最新のWebバックエンドと相互作用するUnityゲームを可能にすることです。次のような(chunked HTTP レスポンス、POST/PUT 操作のストリーミング、HTTP ヘッダや動詞(GET、POST、PUT、DELETE)を完全に制御するなど)高い需要がある機能にも対応します。

一般的な WWW の使い方をしているユーザーは、新しいシステムへ移行するときは、検索して置換処理をするだけで対処できます。

システムは、2レイヤー(層)から構成されています。Low-level API (LLAPI) は最大のフレキシビリティを提供しており、一方 High-Level API (HLAPI) は Low-level API の機能をラップし、よくある操作を実行するのに便利なインターフェースを提供しています。

サポートされているプラットフォーム

UnityWebRequest システムは、Unity Web Player の顕著な例外を除いて、ほとんどの Unity プラットフォームに対応しています。

5.2対応プラットフォーム:

  • Editor & Standalone プレイヤーの全バージョン
  • WebGL

5.3対応プラットフォーム:

  • モバイルプラットフォーム: iOS、Android、Windows Phone 8
  • Windows ストア アプリ

5.xのリリースで随時対応プラットフォームが追加されます。

  • PS3、PS4、PS Vita、PS Mobile
  • XBox 360 と XBox One
  • Wii U

アーキテクチャ

UnityWebRequest のエコシステムは 3つの Distinct 操作に HTTP トランザクションを分けます。

  • サーバーにデータを送信する
  • サーバーからのデータを受信する
  • HTTP フロー制御(リダイレクト、エラー処理、他)

パワーユーザーによりよいインターフェースを提供するために、これらの演算子はそれぞれ個々のオブジェクトによって制御されています。

  • UploadHandler のオブジェクトは、サーバーへデータを転送するのを処理します。
  • DownloadHandlerのオブジェクトは、サーバーから受信したデータの後処理やバッファリングを行います。
  • 他の2つのオブジェクトを管理するUnityWebRequest オブジェクトは、同様に HTTP フロー制御に関する処理を扱います。このオブジェクトを使用するとヘッダ情報(custom header)や URL が定義され、エラーとリダイレクト回数の設定などの情報が格納されます。

指定された HTTP トランザクションに関するジェネリックコードのフローは以下のとおりです。

  • Web Request のオブジェクトを作成
  • Web Request のオブジェクトを設定
    • カスタムヘッダの設定
    • HTTP verb(GET、POST、HEAD、他)を設定
      • カスタム verb を許可
    • URL を設定 *(オプション)Download Handler を作成 & Web Request にアタッチ
    • アップロードするデータを指定
    • HTTP フォームをアップロード
  • (オプション) Download Handler を作成 & Web Request にアタッチ
  • Web Request を送信
    • コルーチンの場合、WWW のように実行した request が終了するまで待機させるため Send() メソッドを呼び出す必要があります。 (オプション)Download Handler から受信データを読み取る (オプション)UnityWebRequest オブジェクトからエラー情報、HTTP ステータスコードやレスポンス情報を読み取る

共通操作:HLAPIを使用する

本セクションでは、High-Level API で利用可能なオプションとそれらが対処することを目的とするシナリオを詳述します。

HTTP サーバーからテキストやバイナリデータを取得(GET)

一般的な HTTP/HTTPS Web サーバーから文字情報やバイナリデータなど単純データを取得するのに使用する呼び出しは、ファクトリーメソッドの UnityWebRequest.Get になります。このメソッドは、引数として単一の文字列を取得します。文字列は、データの取得元となる URL を指定します。

このメソッドは、標準の WWW コンストラクタに類似します。

WWW myWww = new WWW("http://www.myserver.com/foo.txt");
// ... is analogous to ...
UnityWebRequest myWr = UnityWebRequest.Get("http://www.myserver.com/foo.txt");

詳細

このメソッドは UnityWebRequest を作成し、文字列引数に URL を設定します。他にカスタムフラグやヘッダは設定しません。

デフォルトでは、メソッドは UnityWebRequest に標準の DownloadHandlerBuffer をアタッチします。このハンドラーはサーバーから受信したデータをバッファします。また、リクエストが終了したときに、スクリプトが使用できるようになります。

デフォルトでは、メソッドは UnityWebRequestUploadHandler をアタッチしません。利用する場合は手動で 1 つアタッチする必要があります。

例:

using UnityEngine;
using System.Collections;
+using UnityEngine.Networking;

class MyBehaviour: public MonoBehaviour {
    void Start() {
        StartCoroutine(GetText());
    }
 
    IEnumerator GetText() {
        UnityWebRequest www = UnityWebRequest.Get("http://www.my-server.com");
        yield return www.Send();
 
        if(www.isError) {
            Debug.Log(www.error);
        }
        else {
            // Show results as text
            Debug.Log(www.downloadHandler.text);
 
            // Or retrieve results as binary data
            byte[] results = www.downloadHandler.data;
        }
    }
}

HTTP サーバーからテクスチャを検索(GET)

リモートサーバーからテクスチャファイルを検索するには、ファクトリーメソッドUnityWebRequest.Texture. を使用することができます。 このメソッドは UnityWebRequest.GET にかなり類似していますが、ダウンロードやテクスチャを効率的に格納するため最適化されています。

このメソッドは、第一引数として文字列を渡します。その文字列は、テクスチャとして使用したい画像の URL を指定します。

詳細

このメソッドは UnityWebRequest を作成し、文字列引数にターゲットの URL を設定します。つまり、他にカスタムフラグやヘッダは設定しません。

この方法は、UnityWebRequestDownloadHandlerTexture オブジェクトをアタッチします。DownloadHandlerTexture は、Unity Engine でテクスチャとして使われるイメージを格納するために最適化された専門の Download Handler です。このクラスを使用すると、RAW バイトをダウンロードして、スクリプト内でテクスチャを手動で作成することと比較してメモリの再割り当てを大幅に減少することが可能です。

この方法はデフォルトで Upload Handler 上にアタッチします。お望みなら手動で1つ追加することができます。

例:

using UnityEngine;
using System.Collections;
 
class MyBehaviour: public MonoBehaviour {
    void Start() {
        StartCoroutine(GetTexture());
    }
 
    IEnumerator GetTexture() {
        UnityWebRequest www = UnityWebRequest.GetTexture("http://www.my-server.com/image.png");
        yield return www.Send();

        if(www.isError) {
            Debug.Log(www.error);
        }
        else {
            Texture myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture;
        }
    }
}

Alternatively, you can implement GetTexture using a helper getter:
    IEnumerator GetTexture() {
        UnityWebRequest www = UnityWebRequest.GetTexture("http://www.my-server.com/image.png");
        yield return www.Send();

        Texture myTexture = DownloadHandlerTexture.GetContent(www);
    }

HTTP サーバーからアセットバンドルをダウンロード(GET)

リモートサーバーからアセットバンドルを取得するには、UnityWebRequest.GetAssetBundle を使用することができます。このメソッドは、ワーカスレッド上でアセットバンドルのデータをデコード/解凍します。つまり、内部バッファに展開したデータをストリーミングします。

引数によって、ダウンロードの方法を変えることができます。最も単純なやり方としては、ダウンロードするアセットバンドルの URL を引数として渡すだけです。ダウンロードされたデータの整合性を検証するためチェックサムをオプションとして実装できます。

アセットバンドルのキャッシュシステムを使用したい場合、バージョン番号かHash128のデータ構造のいずれか一方を使って提供することができます。これらは旧システムの WWW.LoadFromCacheOrDownload で使用する Hash128 やバージョン番号のオブジェクトと同一です。

詳細

このメソッドはUnityWebRequestを作成し、指定された URL に含まれている引数にターゲット URL を設定します。また、HTTP 動詞として GET を設定できますが、他の動詞やカスタムヘッダーは設定することができません。

このメソッドは、UnityWebRequestDownloadHandlerAssetBundle をアタッチします。このダウンロードハンドラーには、いったん、十分なデータをダウンロードしバンドル内のリソースへアクセスできるようにデコードされたアセットバンドルを抽出するために使用する特別な assetBundleプロパティーを持っています。

引数としてバージョン番号やHash128 オブジェクトを指定する場合、それらの引数もDownloadHandlerAssetBundleに渡します。そのときに、ダウンロードハンドラがキャッシュシステムを取り入れます。

例:

using UnityEngine;
using System.Collections;
 
class MyBehaviour: public MonoBehaviour {
    void Start() {
        StartCoroutine(GetAssetBundle());
    }
 
    IEnumerator GetAssetBundle() {
        UnityWebRequest www = UnityWebRequest.GetAssetBundle("http://www.my-server.com/myData.unity3d");
        yield return www.Send();
 
        if(www.isError) {
            Debug.Log(www.error);
        }
        else {
            AssetBundle bundle = ((DownloadHandlerAssetBundle)www.downloadHandler).assetBundle;
        }
    }
}

代わりに、ヘルパークラスを使用して GetAssetBundle を実装することが可能です。

    IEnumerator GetTexture() {
        UnityWebRequest www = UnityWebRequest.GetAssetBundle("http://www.my-server.com/myData.unity3d");
        yield return www.Send();

        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www);
    }

HTTP サーバーにフォームを送信(POST)

HTML の form としてフォーマットし、サーバーにデータを送信する方法として主に2つあります。

レガシーメソッド: WWWForm を使用する

旧 WWW システムから移行しやすくする目的で、新 UnityWebRequest システムでは、フォームデータを提供するのに、旧 WWWForm オブジェクトを使用できるようにしています。

この場合、メソッドのシグネチャは以下のとおりです。

WebRequest.Post(string url, WWWForm formData);
詳細

このメソッドは、新しい UnityWebRequest オブジェクトを作成し、最初の文字列引数の値にターゲット URL を設定します。また、WWWForm 引数( Content-Type など)で生成された任意のカスタムヘッダを読み取り、UnityWebRequest オブジェクトにそれらをコピーします。

このメソッドは、デフォルトで UnityWebRequest オブジェクトに DownloadHandlerBuffer をアタッチします。便宜上、サーバーの応答を確認するために、これを使用することができます。

このメソッドは、UnityWebRequest オブジェクトにアタッチされる UploadHandlerRaw オブジェクトに、 WWWForm オブジェクトで生成された RAW データを読み取ったものを、`UploadHandlerRawオブジェクトでバッファリングします。 したがって、UnityWebRequest.POSTを呼び出した後のWWWForm オブジェクトへの変更はUnityWebRequest`` に影響を与えません。

例:

using UnityEngine;
using System.Collections;
 
class MyBehavior: public MonoBehaviour {
    void Start() {
        StartCoroutine(Upload());
    }
 
    IEnumerator Upload() {
        WWWForm form = new WWWForm();
        form.AddField("myField", "myData");
 
        UnityWebRequest www = UnityWebRequest.Post("http://www.my-server.com/myform", form);
        yield return www.Send();
 
        if(www.isError) {
            Debug.Log(www.error);
        }
        else {
            Debug.Log("Form upload complete!");
        }
    }
}

新メソッド: IMultipartFormSection を使用する

フォームデータをより詳細に制御する方法として、UnityWebRequestのシステムに(ユーザーが実装可能な)IMultipartFormSectionのインターフェースが含まれています。標準アプリケーションのために、Unity はデータとファイル項目についてもデフォルト実装を提供します。MultipartFormDataSectionMultipartFormFileSection

UnityWebRequest.POST のオーバーロードは、すべての IMultipartFormSectionsオブジェクトをリストとして2番目のパラメータ引数として受け入れます。メソッドの signature は以下のとおりです。

WebRequest.Post(string url, List<IMultipartFormSection> formSections);
詳細

このメソッドは、UnityWebRequestオブジェクトで作成され、最初の文字列パラメータにターゲット URL を設定します。また、IMultipartFormSectionオブジェクトのリストに指定されたフォームデータに適切にUnityWebRequestの Content-Type ヘッダを設定します。

このメソッドは、デフォルトで UnityWebRequest オブジェクトに DownloadHandlerBuffer をアタッチします。便宜上、サーバーの応答を確認するために、これを使用することができます。

WWWForm POSTメソッドと同様に、この HLAPI メソッドは順番に指定される各IMultipartFormSection を呼び出し、RFC 2616で指定されている標準的なマルチパートフォームにそれらをフォーマットします。

フォーマット済みのフォームデータは、標準のUploadHandlerRawオブジェクトに格納された後UnityWebRequestにアタッチされます。その結果、UnityWebRequest.POSTを呼び出した後、実行されたIMultipartFormSection オブジェクトへの変更は、サーバーに送信されたデータに反映されません。

例:

using UnityEngine;
using System.Collections;
 
class MyBehavior: public MonoBehaviour {
    void Start() {
        StartCoroutine(Upload());
    }
 
    IEnumerator Upload() {
        List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
        formData.Add( new MultipartFormDataSection("field1=foo&field2=bar") );
        formData.Add( new MultipartFormFileSection("my file data", "myfile.txt") );

        UnityWebRequest www = UnityWebRequest.Post("http://www.my-server.com/myform", formData);
        yield return www.Send();
 
        if(www.isError) {
            Debug.Log(www.error);
        }
        else {
            Debug.Log("Form upload complete!");
        }
    }
}

HTTPサーバーに Raw データをアップロード(PUT)

一部のモダン Web アプリケーションでは、ファイルは HTTP 動詞の PUT を介してアップロードされるほうを好みます。このシナリオに関して、Unity は UnityWebRequest.PUT メソッドを提供しています。

このメソッドは2つの引数を取得します。最初の引数は文字列で、ターゲット URL を指定します。2番目の引数は文字列かバイト配列のいずれかで、ペイロードデータがサーバーに送信されるように指定する場合があります。

関数のシグネチャは以下のとおりです。

WebRequest.Put(string url, string data);
WebRequest.Put(string url, byte[] data);

詳細

このメソッドは、UnityWebRequest を作成し application/octet-stream に Content Type を設定します。

このメソッドは、標準のDownloadHandlerBufferUnityWebRequestにアタッチします。POST メソッドと同様に、のアプリケーションから結果データを返すために、使用することができます。

このメソッドは、標準のUploadHandlerRawオブジェクトにアップロードするデータを格納し、UnityWebRequestオブジェクトにアタッチします。その結果、byte[]メソッドを使用する場合、UnityWebRequest.PUTを呼び出した後、実行されるバイト配列への変更はサーバーにアップロードされたデータに反映されません。

例:

using UnityEngine;
using System.Collections;
 
class MyBehavior: public MonoBehaviour {
    void Start() {
        StartCoroutine(Upload());
    }
 
    IEnumerator Upload() {
        byte[] myData = System.Text.Encoding.UTF8.GetBytes("This is some test data");
        UnityWebRequest www = UnityWebRequest.Put("http://www.my-server.com/upload", myData);
        yield return www.Send();
 
        if(www.isError) {
            Debug.Log(www.error);
        }
        else {
            Debug.Log("Upload complete!");
        }
    }
}

細かい制御:LLAPI を使用する

HLAPI はボイラープレートコードを必要最小限の見た目だけがあらかじめ調整されるようデザインされている一方、LLAPI は、フレキシビリティを最大限に生かすようにデザインされています。一般的には、UnityWebRequest を作成するのに関わる LLAPI を使用すると、適切にDownloadHandlerUploadHandlerを作成し、あなたの UnityWebRequestにそれらをアタッチします。

本セクションで説明する各オブジェクトの詳細については、スクリプトリファレンスを参照してください。

注意: HLAPI と LLAPI は互いに矛盾するものではありません。共通シナリオを微調整する必要がある場合、あなたは、常に HLAPI を介して作成された UnityWebRequest オブジェクトをカスタマイズすることが可能です。

UnityWebRequest を作成する

WebRequest は、他のオブジェクトみたいに、簡単にインスタンス化することが可能です。2つのコンストラクタが利用できます。標準的なパラメータなしのコンストラクタは、すべてブランクかデフォルト設定で新しい UnityWebRequest を作成します。 * ターゲットに URL が設定されていない。 * カスタムヘッダを設定しない。 * リダイレクト制限は 32 に設定されています。

コンストラクタの2番目の引数には文字列を渡します。文字列引数の値に UnityWebRequest のターゲットを割り当て、それ以外はパラメータなしのコンストラクタと同一です。

UnityWebRequest wr = new UnityWebRequest(); // Completely blank
UnityWebRequest wr2 = new UnityWebRequest("http://www.mysite.com"); // Target URL is set

UploadHandler を作成する

アップロードハンドラは現在 UploadHandlerRaw のみ利用可能です。このクラスはコンストラクション時間でデータバッファを受け入れます。リモートサーバーが本体のデータを受信する準備ができたとき、このバッファは内部的に native-code のメモリにコピーされUnityWebRequest システムで使用されます。

アップロードハンドラも Content Type の文字列を受け入れます。この文字列は、UnityWebRequest そのもので Content-Type ヘッダを設定しない場合、UnityWebRequest の Content-Type ヘッダの値に使用されます。UnityWebRequest オブジェクトに Content-Type ヘッダを手動で設定する場合、アップロードハンドラのオブジェクトで Content-Type は無視されます。

UnityWebRequest かUploadHandlerのいずれか一方に Content-Type を設定しない場合、システムはapplication/octet-streamの Content-Type をデフォルトとして設定します。

例:

byte[] payload = new byte[1024];
// ... fill payload with data ...

UnityWebRequest wr = new UnityWebRequest("http://www.mysite.com/data-upload");
UploadHandler uploader = new UploadHandlerRaw(payload);

// Will send header: "Content-Type: custom/content-type";
uploader.contentType = "custom/content-type";

wr.uploadHandler = uploader;

DownloadHandler を作成する

現在、DownloadHandlersには以下の4つのタイプがあります。

  • DownloadHandlerBufferでは、native-code のバイトバッファに受信データを格納し、raw バイトか UTF8 の文字列に変換するかのいずれかの方法でアクセスが可能になります。
  • DownloadHandlerTextureは、UnityEngine.Textureで受信したデータを格納します。ダウンロードが終了すると、有効な UnityEngine.Texture オブジェクトに JPEG と PNG をデコードします。1コピーのみUnityEngine.TextureDownloadHandlerTextureオブジェクトごとに作成されます。それにより、ガベージコレクション(GC)からパフォーマンスヒットを減らします。 *DownloadHandlerAssetBundle は、Unity のアセットバンドルシステムに受信したデータをストリーミングします。いったん、アセットバンドルシステムが十分なデータを受信したならば、アセットバンドルはUnityEngine.AssetBundleオブジェクトとして使用できるようになります。上記のようにUnityEngine.AssetBundleオブジェクトは、ひとつのコピーのみ使用メモリへのインパクトを減らすために作成されます。
  • DownloadHandlerScriptは、特殊なクラスです。それ自体何も実行しません。しかし、ユーザー定義型で継承することができます。このクラスは、UnityWebRequest システムからコールバックを受け取ります。次に、ネットワークからそれが到達したらデータでカスタム処理を完全に実行するのに使用されることができます。

オーディオクリップ向けに特化した Download Handle も利用可能です。API はDownloadHandlerTextureのインターフェースに似ています。

単純データのストレージ:DownloadHandlerBuffer

このダウンロードハンドラは最も簡単でたいていのユースケースを処理します。簡単に(native-code)バッファに受信データを格納します。ダウンロードが終了すると、バッファリングされたデータをバイト配列としてか UTF8 文字列としてのいずれかでアクセス可能です。

Example:
using UnityEngine;
using System.Collections;
 
class MyBehaviour: public MonoBehaviour {
    void Start() {
        StartCoroutine(GetText());
    }
 
    IEnumerator GetText() {
        UnityWebRequest www = new UnityWebRequest("http://www.my-server.com");
        www.downloadHandler = new DownloadHandlerBuffer();
        yield return www.Send();
 
        if(www.isError) {
            Debug.Log(www.error);
        }
        else {
            // Show results as text
            Debug.Log(www.downloadHandler.text);
 
            // Or retrieve results as binary data
            byte[] results = www.downloadHandler.data;
        }
    }
}

画像をダウンロードする:DownloadHandlerTexture

イメージファイルをダウンロードするのに DownloadHandlerBuffer を使用する間、Texture.LoadImageを使用して RAW バイトからテクスチャを作成することができますが、DownloadHandlerTextureを使用する方がより効率的です。

このダウンロードハンドラは、native コードでバッファリング、解凍、テクスチャ作成を実行します。さらに、大きなテクスチャを読み込むとき、フレーム時間を改善することができるメインスレッドの代わりにワーカースレッド上で実行されます。

最終的に、スクリプト内の byte-to-texture コンバージョン(byte 配列からテクスチャへ変換)の実行と関連するガベージコレクションのオーバーヘッドを排除するテクスチャそのものを作成するとき、最後に、DownloadHandlerTexture専用のマネージメモリを割り当てます。

以下の例では、Sprite に変換、uGUI Image に割り当て、インターネットから PNG をダウンロードします。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
[RequireComponent(typeof(UnityEngine.UI.Image))]
public class ImageDownloader : MonoBehaviour {
    UnityEngine.UI.Image _img;
 
    void Start () {
        _img = GetComponent<UnityEngine.UI.Image>();
        Download("http://www.mysite.com/myimage.png");
    }
 
    public void Download(string url) {
        StartCoroutine(LoadFromWeb(url));
    }
 
    IEnumerator LoadFromWeb(string url)
    {
        UnityWebRequest wr = new UnityWebRequest(url);
        DownloadHandlerTexture texDl = new DownloadHandlerTexture(true);
        wr.downloadHandler = texDl;
        yield return wr.Send();
        if(!wr.isError) {
            Texture2D t = texDl.texture;
            Sprite s = Sprite.Create(t, new Rect(0, 0, t.width, t.height),
                                     Vector2.zero, 1f);
            _img.sprite = s;
        }
    }
}

アセットバンドルをフェッチする:DownloadHandlerAssetBundle

この特殊ダウンロードハンドラの利点は、Unity のアセットバンドルシステムにデータをストリーミングできることです。これは、アセットバンドルをロードするメモリインパクトだけでなくメモリの動的割り当てを大幅に減らします。その上、完全にダウンロードされていない間、アセットバンドルを部分的に使用することができるようなりました。つまり、アセットをストリーミングすることが可能なのです。

すべてのダウンロードと解凍は、ワーカースレッド上で実行されます。

アセットバンドルの検索に特化した assetBundle プロパティを持つ DownloadHandlerAssetBundle オブジェクトを介して Asset Bundle はダウンロードされます。 Asset Bundle のシステムが動作する方法に起因して、すべてのアセットバンドルに関連付けられたアドレスを持つ必要があります。一般的に、これは、そのアドレスがある場所の名目上の URL です(例:リダイレクト前の URL)。ほとんどすべてのケースで、単にUnityWebRequest に渡された同じ URL を渡す必要があります。HLAPI を使用する場合、これはあなたに対して行われます。

例:

using UnityEngine;
using System.Collections;
 
class MyBehaviour: public MonoBehaviour {
    void Start() {
        StartCoroutine(GetAssetBundle());
    }
 
    IEnumerator GetAssetBundle() {
        UnityWebRequest www = new UnityWebRequest("http://www.my-server.com");
        DownloadHandlerAssetBundle handler = new DownloadHandlerAssetBundle(www.url);
        www.downloadHandler = handler;
        yield return www.Send();
 
        if(www.isError) {
            Debug.Log(www.error);
        }
        else {
            // Extracts asset bundle
            AssetBundle bundle = handler.assetBundle;
        }
    }
}

自分でやってみよう: DownloadHandlerScript

ダウンロードしたデータ処理を完全に制御することを求められるパワーユーザーに対して Unity は DownloadHandlerScript というクラスを提供しています。

デフォルトでは、このクラスのインスタンスは何も行いません。しかし、 DownloadHandlerScript を継承したクラスを作成した場合、特定のメソッドをオーバーライドし、ネットワークからデータを受信したときコールバックを受信するのにそれらを使用する場合があります。

注意: 実際のダウンロードはワーカースレッド上で動作するのですが、すべてのDownloadHandlerScript のコールバックはメインスレッド上で実行します。コールバック実行中に、重い計算を行うことは避けてください。

メソッドをオーバーライドする
protected void ReceiveContentLength(long contentLength);

このメソッドは Content-Length ヘッダを受信するとき呼び出されます。

注意:UnityWebRequest の処理中に、サーバー側の問題によりひとつ、または複数のレスポンスをリダイレクトした場合、このコールバックは複数回実行することがあります。

protected void OnContentComplete();

このメソッドは UnityWebRequest オブジェクトを使用しサーバーから全データを完全にダウンロードしたとき呼び出され、受信した全データは ReceiveData コールバックに転送されます。

protected bool ReceiveData(byte[] data, long dataLength);

このメソッドは、リモートサーバーからデータを取得した後に呼び出されます。このメソッドは、1フレームにつき1度呼び出されます。データ引数は、リモートのサーバーから受け取った RAW バイトを含まれています。また、dataLength では、データ配列に新しいデータの長さを表示します。

事前に割り当てられたデータ・バッファを使用しない場合、このコールバックを呼び出すたびに、システムは新しいバイト配列を作成し、dataLength は常にデータ長に等しくなります。事前に割り当てられたデータバッファを使用する場合、データバッファが再利用され、dataLength はアップデートのダウンロードに必要なバイト数を見つけるために使用される必要があります。

このメソッドは、true か false のいずれかの戻り値が必要です。false を返す場合、システムは直ちに UnityWebRequest オブジェクトを停止します。true を返す場合、通常通り処理を続けます。

事前に割り当てられたデータバッファに関する詳細は、以下のサブセクションを参照してください。
GC Overhead の回避:事前に割り当てられたバッファによるDownloadHandlerScripts

Unity のパワーユーザーの多くは、ガベージ コレクションに起因する CPU スパイクの発生を減らすことを常に懸念しています。これらのユーザーのために、UnityWebRequest システムは DownloadHandlerScript の ReceiveData を呼び出してダウンロードしたデータを配信するのに使われる Byte のマネージド配列を事前に割り当てることができるようになりました。

このメソッドを使用すると、ダウンロードされたデータをキャプチャするDownloadHandlerScript オブジェクトの派生クラスを使用する場合、マネージドコードのメモリ割り当てを完全に排除します。

DownloadHandlerScript を事前に割り当てられたマネージドバッファで動作させるためには、単に DownloadHandlerScript のコンストラクタにバイト配列を用意して使用します。

注意:バイト配列のサイズは、各フレームで ReceiveData のコールバックに配信されるデータ量を制限します。小さすぎるバイト配列を指定しないようにしてください。そうすることで、あなたのデータが複数のフレームにわたってゆっくり到達することになります。

サンプル

using UnityEngine;
using System.Collections;

public class LoggingDownloadHandler : DownloadHandlerScript {

    // Standard scripted download handler - will allocate memory on each ReceiveData callback
    public LoggingDownloadHandler(): base() {
    }

    // Pre-allocated scripted download handler
    // Will reuse the supplied byte array to deliver data.
    // Eliminates memory allocation.
    public LoggingDownloadHandler(byte[] buffer): base(buffer) {
    }

    // Required by DownloadHandler base class. Called when you address the 'bytes' property.
    protected override byte[] GetData() { return null; }

    // Called once per frame when data has been received from the network.
    protected override bool ReceiveData(byte[] data, int dataLength) {
        if(data == null || data.Length < 1) {
            Debug.Log("LoggingDownloadHandler :: ReceiveData - received a null/empty buffer");
            return false;
        }

        Debug.Log(string.Format("LoggingDownloadHandler :: ReceiveData - received {0} bytes", dataLength));
        return true;
    }

    // Called when all data has been received from the server and delivered via ReceiveData
    protected override void CompleteContent() {
        Debug.Log("LoggingDownloadHandler :: CompleteContent - DOWNLOAD COMPLETE!");
    }

    // Called when a Content-Length header is received from the server.
    protected override void ReceiveContentLength(int contentLength) {
        Debug.Log(string.Format("LoggingDownloadHandler :: ReceiveContentLength - length {0}", contentLength));
    }
}
モバイルデバイスでのネットワーク Tips
ネットワーキング リファレンス