Unity(UnityWebRequest)

Unity

UnityでHttp通信を行ってみよう。

サーバーサイドの確認

1.まずはWebブラウザから以下のURLにアクセスしてみる。「Hello!」とだけ出力されるコンテンツだ。
https://joytas.net/php/hello.php

UnityからのHttp接続

2.Unityにて新規プロジェクトをHttpLessonとして2Dで作成する。
3.新規スクリプトとしてHttpController.csを作成し、Main Cameraに付与する。usingでUnityEngine.Networkingするのを忘れないこと。

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

public class HttpController : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(GetRequest("https://joytas.net/php/hello.php"));
    }
    IEnumerator GetRequest(string uri){
        using (UnityWebRequest uwr = UnityWebRequest.Get(uri)){
            yield return uwr.SendWebRequest();
            if (uwr.result != UnityWebRequest.Result.Success)
            {
                Debug.Log(uwr.error);
            }
            else
            {
                Debug.Log(uwr.downloadHandler.text);
            }
        }
    }
}

4.実行してみよう。コンソールにHello!と出力されれば成功だ。このようにHttp通信はコルーチンを使って行う。

画像

5.次に画像にアクセスしてみよう。まずはWebブラウザから以下のurlにアクセスしてみる。サーバーに置いてある画像が表示される。
https://joytas.net/php/man.jpg

Canvasの設置

6.Canvasを設置し、Canvasの子要素としてImageを作成しよう。

7.ImageController.csを以下のように作成し、Imageにアタッチする。

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

public class ImageController : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(GetRequest("https://joytas.net/php/man.jpg"));
    }
    IEnumerator GetRequest(string uri){
        using(UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(uri)){
            yield return uwr.SendWebRequest();
            if(uwr.result!=UnityWebRequest.Result.Success){
                Debug.Log(uwr.error);
            }else{
                Texture texture = DownloadHandlerTexture.GetContent(uwr);
                Sprite sp = Sprite.Create(
                    (Texture2D)texture,
                    new Rect(0,0,texture.width,texture.height),
                    new Vector2(0.5f,0.5f)
                    );
                Image image=GetComponent<Image>();
                
                image.rectTransform.sizeDelta=new Vector2(
                    sp.rect.width,sp.rect.height
                );
                image.sprite=sp;
            }
        }
    }
}

8.実行してみよう。サーバーの画像をもとにスプライトが作成され表示された。

POST通信

9.ここではPOSTを利用してパラメーターを送信してみる。以下はパラメータとしてx=5&y=8をPOSTで送信し二つの和をサーバーサイドで計算し結果をコンソールに出力する処理だ。

[参考]サーバーサイドはPHPで書かれた以下のコードが置いてある。

<?php
$x=isset($_POST['x'])? (int)$_POST['x']:0;
$y=isset($_POST['y'])? (int)$_POST['y']:0;
header('Content-Type: text/plain');
echo $x.'+'.$y.'='.($x+$y);

[Unityで作成するコード]

以下のPostController.csを作成し、カメラにアタッチする。

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

public class PostController : MonoBehaviour
{
    void Start(){
        StartCoroutine(PostRequest());
    }
    IEnumerator PostRequest()
    {
        string uri = "https://joytas.net/php/calc.php";
        WWWForm form = new WWWForm();
        form.AddField("x", 5);
        form.AddField("y", 8);
        using(UnityWebRequest uwr = UnityWebRequest.Post(uri,form)){
            yield return uwr.SendWebRequest();
            if(uwr.result != UnityWebRequest.Result.Success){
                Debug.Log(uwr.error);
            }else{
                Debug.Log(uwr.downloadHandler.text);
            }
        }
    }
}



コンソールに以下のように表示されれば成功だ。

課題

二つのフォームを設置し、数値を二ついれ計算ボタンを押すとサーバーにPOSTリクエストを投げ、その計算結果を表示するアプリを作成せよ。サーバーサイドはパラメータxとyに数値を渡すと合計を計算して返すものとする。

ボタンにつけるスクリプト例

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

public class ButtonController : MonoBehaviour
{
    public InputField et1;
    public InputField et2;
    public Text result;
    
    public void btClick() {
        string x = et1.text;
        string y = et2.text;
        StartCoroutine(HttpConnect(x, y));
    }
    IEnumerator HttpConnect(string x,string y) {
        WWWForm form = new WWWForm();
        form.AddField("x", x);
        form.AddField("y", y);
        string url = "https://joytas.net/php/calc.php";
        using(UnityWebRequest uwr = UnityWebRequest.Post(url, form)){
            yield return uwr.SendWebRequest();
            if(uwr.result != UnityWebRequest.Result.Success) {
                Debug.Log(uwr.error);
            } else {
                result.text = uwr.downloadHandler.text;
            }
        }
    }
}

関連記事

以下の記事ではサーバーから音楽データをダウロードして再生します。

コメント

タイトルとURLをコピーしました