Nanashi-softプログラマ専用Unityでゲーム開発


◇Unityでゲーム開発 -JavaScript:連想配列を使う方法-

項目の保存とかに連想配列が使いたくなりました
↓こういうやつです
変数名[項目名]="文字列";

普通に考えると,JavaScriptですので Arrayで書きます
var hensu:Array;
hensu=new Array();
hensu["koumoku"]="mojiretu";
ですが,エラーになりますorz
BCE0017: The best overload for the method 'Array.set_Item(int, Object)' is not compatible with the argument list '(String, String)'.
BCE0049: Expression 'hensu.Item['koumoku']' cannot be assigned to.
なぜなら,Unityの JavaScriptでは,Arrayの引数には数値しか使えない為です

JavaScriptは別の方法に,Objectを使うこともできます
var hensu:Object;
hensu=new Object();
hensu["koumoku"]="mojiretu";
ですが,やはりエラーになります(>_<)"
BCE0048: Type 'Object' does not support slicing.

色々と調査した結果。ふと思いつきました
.NETを呼び出せばいいんじゃない?('-'*)
調べてみると,.NET Frameworkに Hashtable(ハッシュテーブル)クラスを見つけました
リファレンスの C#使用例を見て JavaScriptの書き方を予測すると……
var hensu:Hashtable = new Hashtable();
hensu["koumoku"] = "mojiretu";
Debug.Log(hensu["koumoku"]);
こんな感じで使えるようです


Unityの Javascriptで連想配列を使う方法のまとめ
●変数の宣言
var 変数名:Hashtable=new Hashtable();

例)
var hensu:Hashtable = new Hashtable();

●代入(追加)
変数名[項目名] = "文字列";
または
変数名.Add("項目名", "文字列");
※Addを使用した場合,既にその項目が存在する場合はエラーになります

例)
hensu["koumoku"] = "mojiretu";
例)
hensu.Add("koumoku", "mojiretu");

●削除
変数名.Remove("項目名");

例)
hensu.Remove("koumoku");

●全クリア
変数名.Clear();

例)
hensu.Clear();
例)変数に何も値が入っていない場合のエラーを回避したい
try{
hensu.Clear();
}catch(err){}

●値取得
var 取得変数:String;
取得変数 = 変数名[項目名];

例)
var work:String;
work = hensu["koumoku"];

●値一覧取得
for (var キー変数:String in 変数名.Keys) {
    var 取得変数:String;
    取得変数 = 変数名[キー変数];
}
※keysと頭を小文字で書くと別の意味になるので注意のこと

例)
for (var key:String in hensu.Keys) {
	var work:String;
	work = hensu[key];

	Debug.Log("キー値="+key+",値="+work);
}

●項目が存在するか?
if(変数名.ContainsKey("項目名")){
    //存在する
}else{
    //存在しない
}

例)
if(hensu.ContainsKey("koumoku")){
	Debug.Log("koumokuキーは存在する");
}else{
	Debug.Log("koumokuキーは存在しない");
}

●数値を入れたい場合
この Hashtableクラスには文字しか入りません
数値を入れたい場合は,文字に変換する必要があります

例)数値を入れる
var suuji:int;
suuji = 256;
hensu["koumoku"] = "" + suuji;
例)数値を取り出す
var suu:int;
var work:String;
work = hensu["koumoku"];
suu = parseInt(work);
例)変数内の数値に加算する
var work:String;
work = hensu["koumoku"];
hensu["koumoku"] = "" + (parseInt(work) + 10);

●連想配列のコピー
ただ=で代入しただけではダメでした(newしているので当たり前です)
連想配列としての用途だけで使用している場合は,簡易コピーの Cloneメソッドが使えます

例)
var hensu:Hashtable = new Hashtable();
var copysaki:Hashtable = new Hashtable();

hensu.Add("koumoku", "mojiretu");
copysaki=hensu.Clone();



TOPプログラマ専用Unityでゲーム開発