randomize

2016/05/14

Killzone KidのArmaスクリプト講座:Array(その1)

Armaは配列(注:array)の塊でできていて、まあ私も配列好きなんですけど、Functionやスクリプトを使ったり、アイテムをインベントリに入れたり、あるいは単にオブジェクトの位置を取得したりと、遅かれ早かれ配列に触れることになるだろう。多くのArmaのスクリプトは配列の形式で出力するし、来るべき時にはConfigの検索に活躍するだろう。

配列は角括弧でくくることで認識される。配列は空の配列[]を代入するか、配列の中に複数の値をカンマで区切って入れることで定義できる。値は数字(注:number)、文字列(注:string)、真偽値(注:boolean)、オブジェクト(注:object)、その他なんでも、あるいはいっぺんに全部でも良い。
_array = []; //空の配列
_array = [1,2,3,4,5,6,7,8,9]; //数字の配列
_array = ["Bob","Peter","John"]; //文字列の配列
_array = [player,_var,true,var,56,"ok",_this]; //混合の配列
配列は何の値も入れなくとも、一つの値でも、たくさんの値でも、配列の入った配列も入れられる。特定の配列の中にいくつの値が入っているかを調べるにはcountを使おう。
_array = [];
_result = count _array; //_resultは0
_array = ["hello"];
_result = count _array; //_resultは1
_array = [1,2,3];
_result = count _array; //_resultは3
countは一次元分の配列しか扱えない。多次元配列(訳注:複数の配列が入れ子となっている配列のこと)を調べるには別々に調べる必要がある。
_array = [[1,2,3],[5,6,7]]; //_arrayは2つの配列[1,2,3]と[5,6,7]を内包
配列の中の配列を調べるには、selectと調べたい値が入っている添字(訳注:配列に割り振られている番号のこと)を使う。最初の値の添字は0で、左から右に添字が進み次の値は1、その次は2、という風に。故に15番目の値を調べるにはselect 14をする必要がある。最後の値は内包されている値の数から1を引いた数で調べればよい。
_array = ["orange","blue","red","green"];
_result = _array select 1; //_resultは"blue"
_result = _array select ((count _array) - 1); //_resultは"green"、最後の値
内包された配列を調べるには一つずつselectしていく。次の例の配列の中の2番目の配列の中の最初の配列の3番目の値を取得するためには:
_array = [[[1,2],[3,4]],[[5,6,7],[8,9]]];
_result = ((_array select 1) select 0) select 2; //_resultは7
countの話に戻ろう。この命令には別な構文があり、配列の値それぞれにcode(訳注:{}でくくられたスクリプト)を実行することが出来る。
実行されたcodeがtrueになったら、その値はカウントされ、それ以外はカウントされない。例を挙げるとして、次の配列に"John"が何回出てくるか数えてみよう。
_array = ["John","Samantha","Billy","Archer","John","John","Peter","Casey"];
_result = {_x == "John"} count _array; //_resultは3
お気づきのとおり、_xが使用されている。この書き方で実行したcountは全ての値に対してcode{}の中身を実行しながら反復する。_x特殊変数で、現在実行中の値が代入される。よって現在の値と"John"が同じならばカウントされるのだ。注意として、形が混合された配列の場合正しい形かどうか確かめる必要がある。
//間違い
_array = ["John",23,"Samantha",25,"Billy",67,"Archer",45,"John",23,"John",32];
_result = {_x == "John"} count _array; //エラー
この例においては、2つ目の要素を確認しようとした時にエラーを発する。このコードは_xが文字列である前提で作られているのに数字を引数に採ったためだ。これを回避するには前もって正しい形になっているかを確認する必要がある。同時に通常の構文ではエラーを起こすため、遅延評価の構文も使用する。
//正しい
_array = ["John",23,"Samantha",25,"Billy",67,"Archer",45,"John",23,"John",32];
_result = {typeName _x == "STRING" && {_x == "John"}} count _array; //エラーにならない
配列の中に特定の値が存在するかを確認するには、inを使う。与えた値が検知されたらtrueを返し、それ以外はfalseとなる。特定の値が存在するか、存在するなら添字を返すにはfindを使う。findは値を見つけられなかった場合-1を返し、それ以外は最初に値が出る添字を返す。
_array = [1,"two",3,"four",1,"two",3,"four"];
_result = "four" in _array; //_resultはtrue;
_result = 4 in _array; //_resultはfalse;
_result = _array find "three"; //_resultは-1
_result = _array find 3; //_resultは2
infindは大文字と小文字を区別し、入れ子構造になっている配列については探知できないことも説明しておこう。
_array = ["one","two","three"];
_result = "TWO" in _array; //_resultはfalse
_result = _array find "TWO"; //_resultは-1
/*訳注:以下のスクリプトは現在のバージョンでは正しくありません*/
_array = [[1,2,3],[4,5,6]];
_result = [1,2,3] in _array; //_resultはfalse
_result = _array find [1,2,3]; //_resultは-1
(訳注:Arma 3 1.26から、入れ子構造の配列に関しては機能するようになりました。)
その1は以上。その2は配列の操作と改変について見てみよう。

Enjoy,
KK

追記: このポストを投稿してから、Arma 3には多くの配列関連の命令が追加された。BIKIの配列関連のスクリプト一覧を確認しよう。思いつくだけで…pushBackappendreversesortselect(新構文)deleteAtdeleteRange。また、配列 + 配列の計算も大幅に早くなった。

KK's blog – ArmA Scripting Tutorials: Arrays (Part 1) by Killzone Kid
Translated by POLPOX

0 件のコメント :

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。