この記事でのバージョン
Unity 2017.2.0f3
はじめに
今回はUnityでサーバとデータの送受信したい時に使うUnityWebRequestの話!
基本的な使い方やをちょっとした注意点をまとめてみました。
なお、UnityWebRequestを使うにはusing UnityEngine.Networking;が必要です。
目次
- はじめに
- 目次
- 使い方
- HTTPメソッドの指定
- HTTPヘッダーの設定
- URLエンコード
- フォームデータの生成
- AssetBundleのダウンロード
- Jsonの送受信
- StartCoroutineを使わない
使い方
UnityWebRequestを使う時の流れは以下の通りです。
- UnityWebRequestを生成
- SendWebRequestを実行し、送受信開始
- isNetworkErrorやisHttpError、responseCodeでエラー判定
- エラー(error)または結果(downloadHandler)確認
プログラムにすると以下のような感じです。
なお、メソッドの返り値はIEnumeratorで基本的にStartCoroutineを使って実行します。
//StartCoroutineを使って実行
StartCoroutine(Method());
private IEnumerator Method(){ //1.UnityWebRequestを生成 UnityWebRequest request = UnityWebRequest.Get("http://"); //2.SendWebRequestを実行し、送受信開始 yield return request.SendWebRequest(); //3.isNetworkErrorとisHttpErrorでエラー判定 if(request.isHttpError || request.isNetworkError) { //4.エラー確認 Debug.Log(request.error); } else{ //4.結果確認 Debug.Log(request.downloadHandler.text); } }
responseCodeを使って結果を判定する場合は以下のような具合です。
if(request.responseCode == 404){ Debug.LogWarning("Not Found"); }
HTTPメソッドの指定
GETやPOSTなど、HTTPのメソッドの指定はUnityWebRequestの生成時に行います。
例えばGETを使いたい場合はUnityWebRequest.Get、
POSTを使いたい場合はUnityWebRequest.Postといった感じです。
UnityWebRequest getRequest = UnityWebRequest.Get ("URI"); UnityWebRequest headRequest = UnityWebRequest.Head ("URI"); UnityWebRequest postRequest = UnityWebRequest.Post ("URI", "postData"); UnityWebRequest putRequest = UnityWebRequest.Put ("URI", "bodyData"); UnityWebRequest deleteRequest = UnityWebRequest.Delete("URI");
なお、newでUnityWebRequestを作成し、第二引数にメソッドを指定する事も可能です。
UnityWebRequest postRequest = new UnityWebRequest("URI", "POST");
HTTPヘッダーの設定
HTTPヘッダーを設定するにはUnityWebRequestのSetRequestHeaderを使います。
//UnityWebRequest作成 UnityWebRequest getRequest = UnityWebRequest.Get("URI"); //HTTPヘッダーの設定 getRequest.SetRequestHeader("key", "KEY");
URLエンコード
URLのエンコードにはWWW.EscapeURLを使います。
string url = WWW.EscapeURL("http://test.com/あい/");
またデコードにはWWW.UnEscapeURLを使います。
string url = WWW. UnEscapeURL("http://test.com/%E3%81%82%E3%81%84/");
フォームデータの生成
POSTする際のフォームデータはWWWFormを使って生成すると簡単です。
//フォームデータ生成 WWWForm form = new WWWForm(); form.AddField("method", "POST"); //methodというフィールド名でPOSTという値を設定 //フォームデータを指定し、POSTのUnityWebRequestを作成 UnityWebRequest postRequest = UnityWebRequest.Post("URI", form);
AssetBundleのダウンロード
AssetBundleのダウンロードにはUnityWebRequest.GetAssetBundleを使います。
private IEnumerator Start(){ //AssetBundleをダウンロード(UnityWebRequestを使うにはusing UnityEngine.Networking;が必要) UnityWebRequest request = UnityWebRequest.GetAssetBundle(ASSET_BUNDLE_URL, version:1, crc:0); yield return request.SendWebRequest(); //エラーの時はログで表示 if(request.isHttpError || request.isNetworkError) { Debug.Log(request.error); } else{ //AssetBundleを取得、その中からSpriteを取得し設定 AssetBundle assetBundle = ((DownloadHandlerAssetBundle)request.downloadHandler).assetBundle; GetComponent<SpriteRenderer>().sprite = assetBundle.LoadAsset<Sprite>("character_53"); } }
上記の例の通り、request.downloadHandlerをDownloadHandlerAssetBundleにキャストし、
そこからAssetBundleを取り出します。
Jsonの送受信
受信したJsonをクラスに変換したい場合JsonUtilityを使うと簡単です。
//Jsonの変換用クラス [Serializable] public class JsonClass{ [SerializeField] private int value; public int Value{get{return value;}} [SerializeField] private string text; public string Text{get{return text;}} }
//受信したテキスト(json)を変換
JsonClass jsonClass = JsonUtility.FromJson<JsonClass>(request.downloadHandler.text);
また、Jsonを送信する場合は以下のようにします。
//POSTメソッドのリクエストを作成 UnityWebRequest postRequest = new UnityWebRequest(url, "POST"); //json(string)をbyte[]に変換 byte[] bodyRaw = Encoding.UTF8.GetBytes(json); //jsonを設定 request.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw); request.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer(); //ヘッダーにタイプを設定 request.SetRequestHeader("Content-Type", "application/json");
なお、以下のようにjson(string)をそのまま送ろうとしても上手くいきませんでした。
UnityWebRequest.Post(url, json); request.SetRequestHeader("Content-Type", "application/json");
StartCoroutineを使わない
最初にStartCoroutineを使うという話をしましたが、
IEnumerator型で変数を作成し、そのMoveNextを実行する事でStartCoroutineでも実行可能です。
実際にStartCoroutineを使わずにUnityWebRequestを使っているのが以下の記事になります。