LoginSignup
8
10

More than 3 years have passed since last update.

【Unity(C#)】API通信勉強メモ①

Last updated at Posted at 2019-09-24

やばい

本当に何もわかりません。
今までネットワークとかサーバサイドとか全て無視し続けてきたツケが回ってきました。

必要な技術を言語化する

やりたいことはわかってました。

・Webサイトで登録したアカウントとUnityで作ったexeファイルを紐づけたい
・アカウント登録してないとexeを使えないようにしたい

しかし、これを実現するのに必要な技術がわかりませんでした。

検索ワードで 「Unity サーバー 通信」などで調べると運よく
初心者が送る UnityでAPI通信講座 がヒットしました。

自分のやりたいことっぽかったので、
ひとまず、できないといけないことが「UnityでAPI通信」だと判明しました。

インターネット上の画像を描写する

参考リンク

つまづいたところ

スクリプトに記述 のコードにある、画像のURLがよくわかりませんでした。

画像のURLって何?

Google Drive に保存した画像を直接呼び出せるURLの取得
↑ こちらの方法で解決しました。

WWWを利用する方法とUnityWebRequestを利用する方法どちらも動かしてみてちゃんと動きました。

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

public class GetImage : MonoBehaviour
{
    string url = "画像のURL";

    void Start()
    {
        //それぞれコメントアウトして片方ずつ試した。どっちもちゃんと動いた。
        StartCoroutine(GetImageFromURL());
        StartCoroutine(GetImageWebRequest());
    }

    IEnumerator GetImageFromURL()
    {
        //Unityでは通信が行われたフレームでは値が返ってこないのでコルーチンを使用。
        //WWWクラスはWebにアクセスするためのクラスで、サーバーにGETとPOSTを行うことが可能。
        WWW www = new WWW(url);

        //wwwの値が返ってくるまで処理を止める。
        yield return www;

        //www.textureは、WWWクラスに定義されていて、ダウンロードしたデータからTexture2Dを返す。
        GetComponent<Renderer>().material.mainTexture = www.texture;
    }

    IEnumerator GetImageWebRequest()
    {
        UnityWebRequest request = UnityWebRequestTexture.GetTexture(url);

        //リクエストが通るまで(?)処理を止める。
        yield return request.SendWebRequest();

        Texture2D texture2D = new Texture2D(600, 600);

        //texture2D.LoadImageでbyte配列から画像をロード。
        texture2D.LoadImage(request.downloadHandler.data);
        GetComponent<Renderer>().material.mainTexture = texture2D;
    }
}

Request.gif

GETとPOST

そもそもGETとPOSTがよくわからないのでここを参考にしました。
HTTPとPOSTとGET

コードに落とし込む方法はここを見ました。
UnityでHTTPに接続する

つまづいたところ

接続するURLってなに?ってなりました。

なんでもよかった?のかもしれませんが、こちらを参考に開発用ローカルサーバーというのを立ち上げました。
開発用ローカルサーバを立ち上げる方法

Python3入れてコマンドプロンプトで実行
python -m http.server 8000

しかし、POSTはうまくいかず、
どうやらサーバー側でPOSTメソッドを受け取った際の処理を書かないといけない(?)ようです。
PostError.PNG

Json

JsonでAPIと値のやり取りをすることになる(?)ようなので
やり方を調べました。

サーバー側はまだよくわからないので、
http://IPアドレス:8000をブラウザで開くと表示されるディレクトリ(C:\Users\ユーザー名)の直下に
Jsonファイルを作って配置して実験しました。

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

public class JsonTest : MonoBehaviour {

    public UserData userData = new UserData();
    public string url = "http://IPアドレス:8000";
    public string jsonName;

    IEnumerator Start()
    {
        userData.name = "Yamada";
        userData.age = 20;
        string jsondata = JsonMapper.ToJson(userData);
        print(jsondata);
        WWWForm form = new WWWForm();
        form.AddField("jsondata", jsondata);

        //これはおそらくPOSTになってしまう
        //var www = new WWW(url, form);
        //yield return www;
        //print(www.text);

        UnityWebRequest webRequest = UnityWebRequest.Get(url+ "/"+jsonName);
        //URLに接続して結果が戻ってくるまで待機
        yield return webRequest.SendWebRequest();

        Debug.Log("Get" + " : " + webRequest.downloadHandler.text);
    }
}

var www = new WWW(url, form);はPOSTになってしまうので(?)、つながりませんでした。

用意したJsonファイルはこちらです。
適当にテキストファイル作って拡張子をjsonにするだけです。
書き方のルールはここにありました。
JSON入門

onoJson.json
{"name": "HIKAKIN", "age": 100}

ちゃんと動いてました。

JsonTest.PNG

そういえば、何気に今日はじめて
IEnumerator Startという使い方を見ました。

↓こんな便利な使い方もあって目から鱗でした
【Unity】Startのコルーチン完了後にUpdate処理を開始したい

次やることとしては、サーバー側の処理をよしなにして、POSTを試したいです。


やりました→【Unity(C#),Python】API通信勉強メモ②Flaskでローカルサーバー立ち上げ

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10