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


◇Unityでゲーム開発 -C#で配列-

●配列の種類

3種類ありますので,それらを区別しておく必要があります

・1 次元配列
全てが数珠繋ぎになっているものです
0, 1, 2, 3, 4, 5のように連続します

・多次元配列
1次元配列が複数束になっているものです
0, 1, 2,
0, 1, 2
のように連続します

これを2次元配列と呼び,更にこれを束にしていく事もできます

・ジャグ配列(配列の配列)
1次元配列が複数束になっているもので,それぞれの長さを変動する事ができます
0, 1, 2,
0, 1, 2, 3, 4 ←2コ目の配列が多い
のように連続します

これらそれぞれに対して,更に配列を作る事もできます

◎1次元配列

●宣言と定義

型[] 変数名=new 型[個数];
※変数は全て初期化されます

例)数値変数aを50コ
int[] a=new int[50];
変数内には全て0が入ります

例)文字列変数bを10コ
string[] s=new string[10];
変数内には全てNullが入ります(if文での判定は==nullね)

●値の代入

・宣言時に代入
型[] 変数名={値,値};
※当たり前ですが,2回実行する事はできません。値を変更したい時はnewする必要があります

例)数値を代入
int[] a={0, 1, 2};
例)文字列を代入
string[] s={"a", "bb", "ccc"};
・new時に代入
変数名=new 型[]{値,値};
※前に代入した配列数と異なっていても構いません(前の配列は消えます)
※当たり前ですが,宣言した型と同じである必要があります

例)数値を代入
a=new int[]{3, 4, 5};
例)文字列を代入
s=new string[]{"dd", "eee", "fff"};

●配列の長さ(個数)

変数名.Length
※個数が返って来るので,添え字は 0~変数名.Length - 1になる
※newしていない配列に対して行った場合,error CS0165: Use of unassigned local variable `変数名'エラーになってコンパイルできません

例)配列aの個数をデバッグ表示する
Debug.Log(a.Length);

●値を取り出す

・1つずつ添え字を指定して取り出す
変数名=配列変数名[添え字];
※添え字は0から始まります
※配列の長さよりも大きい添え字を指定すると,恐怖の IndexOutOfRangeException: Array index is out of rangeエラーになります(>_<)"

例)数値配列aから値を取り出す
int b=a[0];
・好きな位置から,好きな位置までを取り出す
for(int i=開始位置; i <= 終了位置; i++){
  変数名=配列変数名[i];
}

例)数値配列aから 2~3番目の値を取り出す
for(int i=1; i <= 2; i++){
	int b=a[i];
}
※添え字の先頭は 0から始まるので,-1した値でループする

・配列全体を取り出す(その1
for(int i=0; i < 配列変数名.Length; i++){
  変数名=配列変数名[i];
}

例)数値配列a全体ループ
for(int i=0; i < a.Length; i++){
	int b=a[i];
}
・配列全体を取り出す(その2
foreach(型 ローカル変数 in 配列変数){
  変数名=ローカル変数;
}

例)数値配列a全体ループ
foreach(int var in a){
	int b=var;
}

●配列の長さを変えたい

変えられません
再度newすれば変更可能ですが,初期化されます

例)配列個数3つのものを4つに変えたい
int[] a=new int[3];
a=new int[4];	//4でnewし直す

●配列に追加したい

できません。newした時の個数は後から変更不可です
変更したい場合は,ArrayListや List<T>を使用して下さい

どうしてもやりたい場合は,一旦別の場所にコピーして,newで長さを変更して,また戻す必要があります

例)配列aの最後尾に値を追加する
int[] a=new int[]{6, 7};	//元の配列
int[] work=a;	//ワーク変数にコピー

a=new int[a.Length + 1];	//サイズを1つ増やす(初期化される)

//ワークから戻す
for(int i=0; i < work.Length; i++){
	a[i]=work[i];
}
//a=work;とすると中でnewし直される為うまくいきません

a[a.Length - 1]=8;	//値を追加
例)これをCopyToを使って書く
int[] a=new int[]{11, 12};	//元の配列
//ワーク変数にコピー
int[] work=new int[a.Length];
a.CopyTo(work, 0);

a=new int[a.Length + 1];	//サイズを1つ増やす

work.CopyTo(a, 0);	//ワークから戻す

a[a.Length - 1]=13;	//値を追加

●配列の安全なコピー

配列を=で代入するとマズい場合が多々あります
CopyToを使えば安全にコピーできます

コピー元配列.CopyTo(コピー先配列, 先頭の添え字);

例)変数aを変数bにコピーする
int[] a=new int[]{8, 9, 10};	//元の配列
int[] b=new int[a.Length];	//コピー先の配列を同じサイズで作る
a.CopyTo(b, 0);	//コピーする
※コピー先の配列が小さいと,ArgumentException: Destination array was not long enough. Check destIndex and length, and the array's lower bounds.エラーが発生します



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

Melonbooks DL