[Unity]UnityWebRequest を使って HTTP リクエストを送ってみる【GET, POST】

株式会社プライムストラクチャーのエンジニアのSayaです。

今回は UnityWebRequest を使って、Unity のアプリケーションから HTTP リクエストを送る方法を試してみたいと思います。
GET リクエストと POST リクエストを送る方法を紹介します。

UnityWebRequest とは

UnityWebRequest は Web サーバーと HTTP 通信を行うために用いられます。
UnityWebRequest で扱える HTTP メソッドは以下の通りです。
* GET
* POST
* HEAD
* PUT
* DELETE
* CREATE

UnityWebRequest は Unity の取り扱うほぼ全てのプラットフォームに対応しています。

検証環境

この検証は以下の環境で行いました。
* macOS Mojave 10.14.5
* Unity 2019.1.6

GET リクエストを送る

まず Unity を開いて新たにプロジェクトを作成します。

プロジェクトを作成したら、Assets 配下に Scripts フォルダを作成してその中に GetRequestScript.cs を作成します。

次に空のゲームオブジェクトを作成して RequestManager と名付け、GetRequestScript.cs をアタッチします。

GetRequestScript に以下の GET メソッドを記述します。

[GetRequestScript.cs]

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

// UnityWebRequest.Get example

// Access a website and use UnityWebRequest.Get to download a page.
// Also try to download a non-existing page. Display the error.

public class GetRequestScript : MonoBehaviour
{
    void Start()
    {
        // A correct website page.
        StartCoroutine(GetRequest("https://www.google.com"));

        // A non-existing page.
        StartCoroutine(GetRequest("https://error.html"));
    }

    IEnumerator GetRequest(string uri)
    {
        using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
        {
            // Request and wait for the desired page.
            yield return webRequest.SendWebRequest();

            string[] pages = uri.Split('/');
            int page = pages.Length - 1;

            if (webRequest.isNetworkError)
            {
                Debug.Log(pages[page] + ": Error: " + webRequest.error);
            }
            else
            {
                Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
            }
        }
    }
}

これでゲームを再生してみるとデバッグログに GET リクエストの結果として「https://www.google.com」の HTML 情報が返ってきます。

POST リクエストを送る

次に新しく PostRequestScript.cs を作成します。

コードは以下のようにします。

[PostRequestScript.cs]

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

public class PostRequestScript : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Upload());
    }

    IEnumerator Upload()
    {
        WWWForm form = new WWWForm();
        form.AddField("myField", "myData");

        using (UnityWebRequest www = UnityWebRequest.Post("http://localhost:8000", form))
        {
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.Log(www.error);
            }
            else
            {
                Debug.Log("Form upload complete!");
            }
        }
    }
}

これを RequestManager にアタッチして、RequestManager の GetRequest.cs のチェックを外します。

次にローカルサーバーを立てます。

php ファイルを作成し、以下のように記述します。

<?php

print_r($_POST);

保存したら以下のコマンドを実行してローカルサーバーを立てます。

php -S localhost:8000 localPHP.php

ローカルサーバーを立てたら Unity の画面に戻ってゲームを再生してみます。

POST リクエストが正常に行われたら以下のように返ってきます。

Form upload complete!
UnityEngine.Debug:Log(Object)

まとめ

今回は UnityWebRequest を用いて GET リクエストと POST リクエストを送る方法を紹介しました。

GET リクエストと POST リクエストはゲームにおいてサーバーとの通信を行う場合に用いることが出来ます。

これ以外にも今後も Unity の様々な通信機能について紹介していけたらと思います。

参考文献

Unity – マニュアル: UnityWebRequest
Unity – Scripting API: Networking.UnityWebRequest.Get
Unity – Scripting API: Networking.UnityWebRequest.Post