
WebPlayerで遊ぶ
この間購入したNGUIを使って、以前のゲームのGUI部分を書き直しました。きれいになっておおむね満足。
部品を作る部分はそうでもないのですが、スクリプトで動かす部分で少し躓きました。
C#のサンプルばかりで、javascriptが見当たらない。勘で書き直してみても無理。
解決方法は
Using NGUI from JavaScript (UnityScript)
公式に説明がありました。フォルダの一部をPluginsに移動する必要があったとのこと。
以後はjavascriptでもちゃんと動きました。
例として(&自分が忘れないようにメモ)
var mylabel:UILabel = GameObject.Find("Label").GetComponent("UILabel");
Debug.Log(mylabel.text);// ラベルの文
var cbox:UICheckbox = GameObject.Find("Checkbox").GetComponent("UICheckbox");
Debug.Log(cbox.isChecked);//チェックボックスtrue false
var bar:UISlider = GameObject.Find("Progress Bar").GetComponent("UISlider");;
Debug.Log(bar.sliderValue);//バーのスライダー値(float、1で100%)
上記のようなかたちで値がとれる。
さらに、部品にはあらかじめセットされた関数もあって受信側のgameobjectを設定してやると受け取れる。
引数に値が入っている。
//ポップアップメニューなどの場合
function OnSelectionChange(str:String){
Debug.Log(str);//変更された項目
}
//スライダーなどの値
function OnSliderChange(myinput:float){
Debug.Log(myinput);
}
インスペクターで関数名も変えられるので、複数あってかぶる場合は変更。buttonの場合は最初はついていないので
Component>NGUI>Interaction>ButtonMessageでアタッチする。
このほかにUITweenといってitweenに似たクラスで色や大きさを自然に変えられたりするのが便利でした。
そして独自フォントや画像を使うといったカスタマイズ。これらの説明は別記事でやる予定です。
少し休憩をして

NGUI: Next-Gen UI
大人気のGUIライブラリ、NGUIを購入しました。
噂どおりに使い勝手がよさそうです。とりあえず最初のチュートリアルやってみました。
色使いのセンスwww
次はスクリプトで制御するのとカスタマイズですね

WebPlayerで見る
完成しました。遊んだ後、登録などしてみてください(ランキングはリセットする可能性があります)
ゲーム終了後、リザルト画面にとび、名前が入力されていればpost送信処理を行うというものです。
送信に使った関数の部分です
function sendName(name:String){
if(name != ""){
var url1 = "送信先のサーバプログラム";
var wwwForm:WWWForm = new WWWForm();
wwwForm.AddField( "name", name );
var score = "" +スコア;
wwwForm.AddField( "score", score );
var timer:float = 時間(秒);
var time = "" + String.Format("{0:00}:{1:00}:{2:00}", Mathf.Floor(timer / 60f), Mathf.Floor(timer % 60f), timer % 1 * 100);
wwwForm.AddField( "time", time );
var gettext : WWW = new WWW(url1,wwwForm);
yield gettext;
if(gettext.text == "success"){
stringToEdit = "";
infotext.text = "THANK YOU!!";
audio.Play();
yield WaitForSeconds (0.5);
backHome();//スタート画面に戻る自作関数
}else{
infotext.text = "ERROR!";
stringToEdit = "";
}
}
}
stringToEditはテキストフィールドです。
infotextはメッセージ表示のGUItext。
サーバ側は受け取ったpost項目をファイルに書き込みます。読み出し側のphpはスコアでソート、これをjson形式にして返すようになっています。
他にもフェードの機能(画面すべて、BGMなども)、演出ブラッシュアップなど。スコアが全体的に低いのでバランスも考えもっと変えるつもりです。
予想以上に時間がかかってしまいました。
サーバ側の解説はまた後日やりたいと思います。

WebPlayerで見る
前回の続きです
今回やるのはwebからのjson読み込みです。
まず、サーバにjsonを用意します。ネットランキングなので入出力のできるphpで動的に生成する予定ですが、今回はそのまま
[
{"name":"myname","score":1200,"time":"00:00:00"},
{"name":"myname","score":1200,"time":"00:00:00"},
//省略
{"name":"myname","score":1200,"time":"00:00:00"}
]
のようなものを置いておきました。
jsonをパースする(分解して加工する)機能はUnity自体にはありませんので、ライブラリを使います。
今回は
LitJson
他にもいくつか試しましたが、一番手間がかからなかったのがこれでした。
使い方はダウンロード後、解凍したLitJsonフォルダを「Plugins」というフォルダにいれること。
スクリプトの先頭で宣言すること。
ちなみに、なぜxmlにしなかったのかはセキュリティ(クロスドメイン)の問題もあります。
jsonだとwebplayerでもローカルのテストでもとってくれて便利。
ランキング画面のスクリプトです
#pragma strict
import LitJson;
var url = "http://json場所";
var string : String = "Loading...";
function Start () {
var getJSON : WWW = new WWW( url );
yield getJSON;
var jsonParser:JsonData = JsonMapper.ToObject(getJSON.text);
string ="";
for (var i=0; i<jsonParser.Count; i++){
string += jsonParser[i]["name"];
string += " ";
string += jsonParser[i]["score"];
string += " ";
string += jsonParser[i]["time"];
string += "\n";
}
}
//表示のGUI部分は省略
ネット上からとってくる前提として、
var getJSON : WWW = new WWW( url );
yield getJSON;
読み込まれるまで待つ。
var jsonParser:JsonData = JsonMapper.ToObject(getJSON.text);
ここでパース。あとは一般的な連想配列になっている感じです。
基本の使い方は
UnityでJSONを扱う
javascriptでやる部分に関しては
Tutorial: Loading and parsing external XML and JSON files with Unity – Part 2: JSON
このあたりが参考になりました。
ソート等はサーバ側で処理したほうが早そうです。
次はスコアをpost送信してファイルに書き込みできるようにする予定です。

以前作ったゲームに、追加機能としてネットランキング機能を作りたいと思っています。
スタート画面にランキングボタンを設置。ランキング画面を作成。
複数行にわたる可能性があるので、GUIのテキストフィールドとスクロールバーを使うことにしました。ひどい手抜きだ。
中身のテキストをこれからネットで読み込めるようにしたいと思います。
var string : String = "Hello World";
var scrollViewVector :Vector2 = Vector2.zero;
function OnGUI () {
scrollViewVector = GUI.BeginScrollView (Rect (100, 100, 450, 300), scrollViewVector, Rect (100, 100, 450, 400));
string = GUI.TextArea (Rect (100, 100, 800, 800), string);
GUI.EndScrollView();
if (GUI.Button(Rect(Screen.width/2 -100,420,200,40),"BACK")){
Application.LoadLevel ("start");
}
}
はっきりいって公式リファレンスとあまり変わりありません。数値も結構あてすっぽうだったりします。要研究。
水平のバーはいらないんだけどな。次回はネット上のxmlやjson等を読み込むところまで行きたいと思います。