---
# System prepended metadata

title: UnityWebRequest
tags: [Unity, C#]

---

UnityWebRequest
=============================
###### tags: `Unity`, `C#`

UnityWebRequestを使ったのでまとめます。

##### 参考にしたサイト
- [UnityWebRequest マニュアル](https://docs.unity3d.com/ja/2018.4/Manual/UnityWebRequest.html)
- [UnityWebRequest オブジェクト スクリプトリファレンス](https://docs.unity3d.com/ja/2019.1/ScriptReference/Networking.UnityWebRequest.html)

準備
-----------------------------
```csharp=
using UnityEngine.Networking;
```

データを取得する
-----------------------------

### GET
GETリクエストをして、テキストデータをサーバーから取得します。
```csharp=
public class Request : MonoVehaviour
{
    void Start(){
        // 以下で定義したコルーチンを開始する
        StartCoroutine(GetText());
    }
    
    IEnumerator GetText(){
        // UnityWebRequestオブジェクトをGetメソッドで取得する
        UnityWebRequest www = UnityWebRequest.Get(address);
        // リモートサーバーへの通信を開始する
        yield return www.SendWebRequest();
        
        // エラーによる分岐
        if(www.isNetworkError || www.isHttpError){
            Debug.Log("Error");
        }
        else{
            // 取得したテキストの表示
            Debug.Log(www.downloadHandler.text);
        }
    }
}
```

- [UnityWebRequest](https://docs.unity3d.com/ja/2019.1/ScriptReference/Networking.UnityWebRequest.html)
- [UnityWebRequest.Get](https://docs.unity3d.com/ja/2019.1/ScriptReference/Networking.UnityWebRequest.Get.html)
- [DownloadHandler](https://docs.unity3d.com/ja/2019.1/ScriptReference/Networking.DownloadHandler.html)

以下、クラス定義とStartメソッドは``StartCoroutine()``内だけを実行させたい関数に書き換えるだけでほぼ同じなので割愛させてもらいます。

### GET(Texture)
画像データを取得したい場合は、``UnityWebRequestTexture``オブジェクトを使用します。
```csharp=
IEnumerator GetTexture(){
    UnityWebRequest www = UnityWebRequestTexture.GetTexture(address);
    yield return www.SendWebRequest();
    
    if(www.isNetworkError || www.isHttpError){
        Debug.Log("Error");
    }
    else{
        // 取得した画像をシーンにあるImageオブジェクトに貼り付ける
        Texture2D myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture as Texture2D;
        Image image = GameObject.Find("Image").GetComponent<Image>();
        image.sprite = Sprite.Create(myTexture, new Rect(0, 0, myTexture.width, myTexture.height), Vector3.zero);
    }
}
```

データを送信する
-----------------------------
### PUT
PUTリクエストをして、テキストデータをサーバーに送信します。
```csharp=
IEnumerator UploadText(){
    UnityWebRequest www = UnityWebRequest.Put(address, "hogehoge");
    yield return SendWebRequest();
    
    if(www.isNetworkError || www.isHttpError){
        Debug.Log("Error");
    }
    else{
        Debug.Log("Send Success");
    }
}
```

### POST
POSTリクエストをして、(id, name)などの組からなるフォームデータをサーバーに送信します。
```csharp=
IEnumerator UploadPost() {
    // フォームデータの作成
    List<IMultipartFormSection> form = new List<ImultipartFormSection>();
    form.Add( new MultipartFormDataSection("id", "1") );
    
    UnityWebRequest www = UnityWebRequest.Post(address, form);
    yield return SendWebRequest();
    
    if(www.isNetWorkError || www.isHttpError){
        Debug.Log("Error");
    }
    else{
        Debug.Log("Send Success");
    }
}
```

テキストデータを送信して、サーバーからテキストデータを取得する
-----------------------------

POSTリクエストを送ることでサーバー側がリクエストに応じたデータを返すとき、
返されたデータを確認するには、UnityWebRequest内の``downloadHandler.text``
を確認すれば良い。

```csharp=
IEnumerator GetText(string id) {
    List<IMultipartFormSection> form = new List<IMultipartFormSection>();
    form.Add( new MultipartFormDatasection("id", id) );
    
    UnityWebRequest www = UnityWebRequest.Post(address, form);
    yield return www.SendWebRequest();
    
    if(www.isNetworkError || www.isHttpError){
        Debug.Log("Error");
    }
    else{
        // 送ったIDに応じて返されたデータを表示する
        Debug.Log(www.downloadHandler.text);
    }
}
```