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でゲーム開発○



