※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。


Unity 2019.1のUnityWebRequestの使い方解説

愚痴 ネットワーク UnityWebRequest unity

投稿日:2019年10月17日

このエントリーをはてなブックマークに追加
UnityWebRequestはUnityが提供している通信ライブラリです。このドキュメントだけだと初心者の方は使い方がわからないのでは?と思ったので使い方をまとめました。

UnityWebRequestについて

基本

UnityWebRequestはUnity公式が出している通信用モジュールです。RestAPIを叩く場合やWebページの情報を取得する場合などのHttpの通信を行う場合には基本的にこのモジュールを使っておけば問題ないでしょう。この記事ではこのUnityWebRequestの使い方についてまとめます。

気になる点

僕が使っている限り、このモジュール自体にはバグなどの問題はないように思います。問題があるのはUnity公式ドキュメントのほうにあります。この記事ではモジュールの使い方と合わせてドキュメントのどこに問題があるのかについても解説します。


GETのリクエストを送る場合

基礎

GETのリクエストを送る場合、基本的に公式ドキュメントのやり方そのままで実装できます。しかし、注意してほしいのはSendメソッドが非推奨(新しいメソッドあるのでそっち使って~。古いほうはそのうち消えちゃうよ~)になっている事です。

はい。これがUnityドキュメントの問題点その1です。

Unity公式ドキュメントの問題点その1:公式ドキュメントの情報が古い!?

我々エンジニアは公式のドキュメントを最も信用しています。このサイトのようなエンジニアブログやQiitaなどのSNSは間違いのある可能性があり、あくまで補助的な資料程度に考えています。

それなのに公式ドキュメントが更新されないとは...(汗)。

それ以外の箇所については公式の通りで問題ありません。

NewBehaviourScript.cs
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(APIExample());
    }

    // Update is called once per frame
    void Update()
    {

    }

    IEnumerator APIExample()
    {

        string url = "http://fakerestapi.azurewebsites.net/api/Authors";
        UnityWebRequest request = UnityWebRequest.Get(url);
        // データをJSONで受け取りたいのでHeaderをセット
        request.SetRequestHeader("Content-Type", "application/json");
        yield return request.SendWebRequest();
        if (request.isNetworkError || request.isHttpError)
        {
            // エラーが起きた場合はエラー内容を表示
            Debug.Log(request.error);
        }
        else
        {
            // レスポンスをテキストで表示
            Debug.Log(request.downloadHandler.text);

            // もし画像データなどの場合はバイトデータとして受け取る
            byte[] results = request.downloadHandler.data;
        }
    }
}

POSTのリクエストを送る場合

POSTリクエストを送る際、多くの場合でサーバーに何かしらのデータを送ることになります。データを送る方法はいくつかあるのですが、ほとんどのRestAPIはjson形式のデータをbodyに入れて送ってもらうような仕様になっています。

ここでUnity公式ドキュメントの問題点二つ目です。

Unity公式ドキュメントの問題点その2:サンプルプログラムがjson形式のデータじゃない!?

公式ドキュメントにはUnityWebRequestをどのように使うかのサンプルが書いてあるのです。それがなんとそのサンプルのコードがデータをform形式で送っているものしかないのです!!RestAPIを使って開発をしている方はこれがどれほどおかしいかわかっていただけるでしょう。世の中のRestAPIはほとんどjson形式でデータをやり取りしているのです。Unityでデータを受け取るときもおそらくほとんどの割合でデータの形式はjsonでしょう。(Unityで使うデータをHTMLやXMLで受け取ってもしょうがないからね!)

つまり...

ドキュメントの通りのコードでは世の中のほとんどのRestAPIは使えない。

ということなのです...(汗)。

jsonで送る場合にはデータ用のClassを作りそのインスタンスをJsonUtilityでJson形式にして送りましょう!!

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

public class NewBehaviourScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(APIExample());
    }

    // Update is called once per frame
    void Update()
    {

    }

    public class PostData
    {
        public string name;
        public string salary;
        public string age;
    }
    IEnumerator APIExample()
    {

        string url = "http://fakerestapi.azurewebsites.net/api/Authors";
        // JSONのデータをBodyに入れてPOSTする
        PostData postData = new PostData();
        postData.name = "ogihara";
        postData.salary = "123";
        postData.age = "234";
        string myJson = JsonUtility.ToJson(postData);
        byte[] byteData = System.Text.Encoding.UTF8.GetBytes(myJson);
        UnityWebRequest request = new UnityWebRequest(url, "POST");
        request.uploadHandler = (UploadHandler)new UploadHandlerRaw(byteData);
        request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");
        yield return request.SendWebRequest();


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


関連記事

記事へのコメント