(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

UnityWebRequestの使い方【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2017.2.0f3


はじめに

今回はUnityでサーバとデータの送受信したい時に使うUnityWebRequestの話!



基本的な使い方やをちょっとした注意点をまとめてみました。


なお、UnityWebRequestを使うにはusing UnityEngine.Networking;が必要です。


使い方

UnityWebRequestを使う時の流れは以下の通りです。

  1. UnityWebRequestを生成
  2. SendWebRequestを実行し、送受信開始
  3. isNetworkErrorやisHttpError、responseCodeでエラー判定
  4. エラー(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を使っているのが以下の記事になります。