[Unity] 通信について(WWWとJSONObject)

こんにちは。松村です。

今日は外部テキストデータの通信方法(JSON)について書きます。
外部データとのやり取りにはWWWとWWWFormというクラスを使います。
今回はJavascriptで書いています。

WWWは通信をつかさどり、WWWFormはサーバに送るデータを作成します。

● 1.送るデータの作成
WWWFromクラスをインスタンス化し、AddFieldで送る値を設定します。

var wwwForm:WWWForm = new WWWForm();
wwwForm.AddField( “変数名”, 実際の値 );

● 2.データ通信
WWWクラスをインスタンス化し、1で作ったwwwFormの値を第二引数に渡してあげます。

var www:WWW = new WWW (“通信するURL” ,wwwForm);

● 3.データの受け取り
サーバに送ってから、レスポンスをもらうまで、タイムラグがありますが、
レスポンスを待つのにyieldを使います。
yieldは何秒か待つ処理をするときによく使うのですが、サーバ通信でも使います。

yield www;

あとは、以下のようにJSONObjectを使って解析していきます。
JSONObjectは以下のところからスクリプトのファイルをダウンロードしてきます。
このJSONObjectはC#のコードなのですが、Plungins, Editor, Standard Assetesの
どれかのフォルダに配置するとJavascriptからも呼び出すことができます。

・JSONObjectファイルの解説ページ
http://www.unifycommunity.com/wiki/index.php?title=JSONObject


var json:JSONObject = new JSONObject(www.text);
var val:JSONObject = json.GetField(“val”);

● 4.データの解析
データの解析はJSONObjectクラスを使うのですが、
Unityで扱うには文字列や数値に置き換える必要があります。
JSONObjectから文字列を取り出す必要があります。

・数値への置き換え
var val:JSONObject = json.GetField(“val”);
var valStr:Sting = val.str;

・文字列への置き換え
var val:JSONObject = json.GetField(“val”);
var valStr:Sting = val.str;
var valInt:int = int.Parse(valStr);

・1行にしたい場合はas JSONObjectをつけます
var valInt:int = int.Parse((json(“val”) as JSONObject).str);

● 5.複数データの解析
友達の情報のように複数のデータがある場合は、listプロパティを使います。

・最初の友達情報取得
var friend:JSONObject = json.GetField(“friend”).list[0];

・友達の人数取得
var friendsNum:JSONObject = json.GetField(“friend”).list.Count;

● サンプル例 
ということで、サーバから複数の情報を取得すると以下のような感じになるかと思います。

// サーバに送るデータの作成
var wwwForm:WWWForm = new WWWForm();
wwwForm.AddField(“id”, “abcd”);

// サーバとの通信
var www:WWW = new WWW (“URL”, wwwForm);

// サーバからのデータ待機
yield www;

// JSONObjectでの解析
var json:JSONObject = new JSONObject(www.text);
var friends:JSONObject = json.GetField(“friend”);

for(var i:int = 0; i < friends.list.Count; i++) { var friend:JSONObject = friends.list[i] as JSONObject; var friend_name:JSONObject = friend.GetField("friend_name") as JSONObject; Debug.Log("友達の名前は:"+friend_name.str); } ● プリローダの挿入 Flashを違って、データの送受信とも同じところに記述できるので、プリローダはとても簡単に挿入できます。 通信の前にプリローダを開始して、通信のあとにプリローダを停止するだけです。 // プリローダの開始を挿入 startPreloader(); // 通信 var www:WWW = new WWW (url ,wwwForm); yield www; // プリロータの停止を挿入 stopPreloader(); 次回は外部画像のロードを書いてみたいと思います。
・Unityで作ったiPhone、Androidアプリ”みそだ教授の「おミソわけ」”をリリースしました!
http://cshool.co.jp/apps/misodajump/jp/

・クスール学校事業部で3Dコンテンツの開発プロセスを基礎から学ぶ「Unity講座」やっています。
http://www.cshool.jp/course/unity/