Unity で作成したゲームからデータを送受信する際のメモ。
ローカルで完結するようなゲームでも例えばハイスコアを送信したりサーバにあるランキングを受信したりとか、大掛かりなものになればサーバ上にあるテクスチャをロードするのに利用したりとか、チャット機能のクライアントを実装したりとか、いろいろ使う場面はありそう。
GET
GET は URL 投げるだけなのでとてもシンプルですね。
string url = "http://example.com/";
WWW www = new WWW(url);
yield return www;
if (www.error == null) {
Debug.Log(www.text);
}
POST
POST は送信するデータを別に指定しないといけませんがそれ以外は GET と同じです。
string url = "http://example.com/";
WWWForm form = new WWWForm();
form.AddField("hoge", "fuga");
form.AddField("foo", "bar");
WWW www = new WWW(url, form);
yield return www;
if (www.error == null) {
Debug.Log(www.text);
}
メソッド化
上記のスクリプトでも一応通信はできるが、使い回しがしにくい。そこで stackoverflow にあった以下のスクリプトを利用する。
c# - Unity GET/POST Wrapper - Stack Overflow
class Wrapper : MonoBehaviour {
public WWW GET(string url) {
WWW www = new WWW (url);
StartCoroutine (WaitForRequest (www));
return www;
}
public WWW POST(string url, Dictionary<string,string> post) {
WWWForm form = new WWWForm();
foreach(KeyValuePair<string,string> post_arg in post) {
form.AddField(post_arg.Key, post_arg.Value);
}
WWW www = new WWW(url, form);
StartCoroutine(WaitForRequest(www));
return www;
}
private IEnumerator WaitForRequest(WWW www) {
yield return www;
// check for errors
if (www.error == null) {
Debug.Log("WWW Ok!: " + www.text);
} else {
Debug.Log("WWW Error: "+ www.error);
}
}
}
これを適当な GameObject につけといて以下のように利用する。Coroutine を利用するので Monobehaviour が必要 == GameObject につけないといけない、ということだろうか。
private Wrapper w;
void Start() {
w = GameObject.find("Wrapper").GetComponent<Wrapper>();
WWW results = w.GET("http://example.com/");
Debug.Log(results.text);
}
問題点
上記の方法でも一々 WWW を利用するためだけに GameObject にスクリプトを付けないといけなくて面倒くさい。これを解決するには Singleton で実装する必要がある。
また、タイムアウトなどの処理を一切考慮していないので実際に利用する際はそのへんを考慮する必要があるだろう。
このへんの解決はまた今度ということで。。。
コメント
KeyValuePairの中が大文字のStringになっています
指摘ありがとうございます、修正を行いました。
[…] Lonely Mobiler さん「Unity から GET/POST でサーバにアクセスする」 http://loumo.jp/wp/archive/20140218000116/ […]