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対応プラットフォーム:
5.3対応プラットフォーム:
5.xのリリースで随時対応プラットフォームが追加されます。
UnityWebRequest のエコシステムは 3つの Distinct 操作に HTTP トランザクションを分けます。
パワーユーザーによりよいインターフェースを提供するために、これらの演算子はそれぞれ個々のオブジェクトによって制御されています。
UploadHandler
のオブジェクトは、サーバーへデータを転送するのを処理します。DownloadHandler
のオブジェクトは、サーバーから受信したデータの後処理やバッファリングを行います。UnityWebRequest オブジェクト
は、同様に HTTP フロー制御に関する処理を扱います。このオブジェクトを使用するとヘッダ情報(custom header)や URL が定義され、エラーとリダイレクト回数の設定などの情報が格納されます。指定された HTTP トランザクションに関するジェネリックコードのフローは以下のとおりです。
Send()
メソッドを呼び出す必要があります。
(オプション)Download Handler から受信データを読み取る
(オプション)UnityWebRequest オブジェクトからエラー情報、HTTP ステータスコードやレスポンス情報を読み取る本セクションでは、High-Level API で利用可能なオプションとそれらが対処することを目的とするシナリオを詳述します。
一般的な 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
をアタッチします。このハンドラーはサーバーから受信したデータをバッファします。また、リクエストが終了したときに、スクリプトが使用できるようになります。
デフォルトでは、メソッドは UnityWebRequest
に UploadHandler
をアタッチしません。利用する場合は手動で 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;
}
}
}
リモートサーバーからテクスチャファイルを検索するには、ファクトリーメソッドUnityWebRequest.Texture.
を使用することができます。 このメソッドは UnityWebRequest.GET
にかなり類似していますが、ダウンロードやテクスチャを効率的に格納するため最適化されています。
このメソッドは、第一引数として文字列を渡します。その文字列は、テクスチャとして使用したい画像の URL を指定します。
このメソッドは UnityWebRequest
を作成し、文字列引数にターゲットの URL を設定します。つまり、他にカスタムフラグやヘッダは設定しません。
この方法は、UnityWebRequest
にDownloadHandlerTexture
オブジェクトをアタッチします。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);
}
リモートサーバーからアセットバンドルを取得するには、UnityWebRequest.GetAssetBundle を使用することができます。このメソッドは、ワーカスレッド上でアセットバンドルのデータをデコード/解凍します。つまり、内部バッファに展開したデータをストリーミングします。
引数によって、ダウンロードの方法を変えることができます。最も単純なやり方としては、ダウンロードするアセットバンドルの URL を引数として渡すだけです。ダウンロードされたデータの整合性を検証するためチェックサムをオプションとして実装できます。
アセットバンドルのキャッシュシステムを使用したい場合、バージョン番号かHash128のデータ構造のいずれか一方を使って提供することができます。これらは旧システムの WWW.LoadFromCacheOrDownload
で使用する Hash128
やバージョン番号のオブジェクトと同一です。
このメソッドはUnityWebRequest
を作成し、指定された URL に含まれている引数にターゲット URL を設定します。また、HTTP 動詞として GET
を設定できますが、他の動詞やカスタムヘッダーは設定することができません。
このメソッドは、UnityWebRequest
に DownloadHandlerAssetBundle
をアタッチします。このダウンロードハンドラーには、いったん、十分なデータをダウンロードしバンドル内のリソースへアクセスできるようにデコードされたアセットバンドルを抽出するために使用する特別な 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);
}
HTML の form としてフォーマットし、サーバーにデータを送信する方法として主に2つあります。
旧 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!");
}
}
}
フォームデータをより詳細に制御する方法として、UnityWebRequest
のシステムに(ユーザーが実装可能な)IMultipartFormSection
のインターフェースが含まれています。標準アプリケーションのために、Unity はデータとファイル項目についてもデフォルト実装を提供します。MultipartFormDataSection
、MultipartFormFileSection
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!");
}
}
}
一部のモダン 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 を設定します。
このメソッドは、標準のDownloadHandlerBuffer
をUnityWebRequest
にアタッチします。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!");
}
}
}
HLAPI はボイラープレートコードを必要最小限の見た目だけがあらかじめ調整されるようデザインされている一方、LLAPI は、フレキシビリティを最大限に生かすようにデザインされています。一般的には、UnityWebRequest を作成するのに関わる LLAPI を使用すると、適切にDownloadHandler
やUploadHandler
を作成し、あなたの UnityWebRequest
にそれらをアタッチします。
本セクションで説明する各オブジェクトの詳細については、スクリプトリファレンスを参照してください。
注意: HLAPI と LLAPI は互いに矛盾するものではありません。共通シナリオを微調整する必要がある場合、あなたは、常に HLAPI を介して作成された 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
アップロードハンドラは現在 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;
現在、DownloadHandlers
には以下の4つのタイプがあります。
DownloadHandlerBuffer
では、native-code のバイトバッファに受信データを格納し、raw バイトか UTF8 の文字列に変換するかのいずれかの方法でアクセスが可能になります。DownloadHandlerTexture
は、UnityEngine.Texture
で受信したデータを格納します。ダウンロードが終了すると、有効な UnityEngine.Texture
オブジェクトに JPEG と PNG をデコードします。1コピーのみUnityEngine.Texture
がDownloadHandlerTexture
オブジェクトごとに作成されます。それにより、ガベージコレクション(GC)からパフォーマンスヒットを減らします。
*DownloadHandlerAssetBundle
は、Unity のアセットバンドルシステムに受信したデータをストリーミングします。いったん、アセットバンドルシステムが十分なデータを受信したならば、アセットバンドルはUnityEngine.AssetBundle
オブジェクトとして使用できるようになります。上記のようにUnityEngine.AssetBundle
オブジェクトは、ひとつのコピーのみ使用メモリへのインパクトを減らすために作成されます。DownloadHandlerScript
は、特殊なクラスです。それ自体何も実行しません。しかし、ユーザー定義型で継承することができます。このクラスは、UnityWebRequest システムからコールバックを受け取ります。次に、ネットワークからそれが到達したらデータでカスタム処理を完全に実行するのに使用されることができます。オーディオクリップ向けに特化した Download Handle も利用可能です。API はDownloadHandlerTexture
のインターフェースに似ています。
このダウンロードハンドラは最も簡単でたいていのユースケースを処理します。簡単に(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;
}
}
}
イメージファイルをダウンロードするのに 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;
}
}
}
この特殊ダウンロードハンドラの利点は、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;
}
}
}
ダウンロードしたデータ処理を完全に制御することを求められるパワーユーザーに対して 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 を返す場合、通常通り処理を続けます。
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));
}
}