##やばい
本当に何もわかりません。
今までネットワークとかサーバサイドとか全て無視し続けてきたツケが回ってきました。
##必要な技術を言語化する
やりたいことはわかってました。
・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;
}
}
##GETとPOST
そもそもGETとPOSTがよくわからないのでここを参考にしました。
HTTPとPOSTとGET
コードに落とし込む方法はここを見ました。
UnityでHTTPに接続する
####つまづいたところ
接続するURLってなに?ってなりました。
なんでもよかった?のかもしれませんが、こちらを参考に開発用ローカルサーバーというのを立ち上げました。
開発用ローカルサーバを立ち上げる方法
python -m http.server 8000
しかし、POSTはうまくいかず、
どうやらサーバー側でPOSTメソッドを受け取った際の処理を書かないといけない(?)ようです。
##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入門
{"name": "HIKAKIN", "age": 100}
ちゃんと動いてました。
そういえば、何気に今日はじめて
IEnumerator Start
という使い方を見ました。
↓こんな便利な使い方もあって目から鱗でした
【Unity】Startのコルーチン完了後にUpdate処理を開始したい
次やることとしては、サーバー側の処理をよしなにして、POSTを試したいです。