[unity] 配列・リスト・二次元配列

配列

宣言、データの格納、データの取得
//⚫︎宣言
// [SerializeField]を頭につけるとインスペクター上で確認できる
// [SerializeField] public int[] array;のような感じ
int[] array = new int[3];//3つの枠を持った配列
int[] array = {0,1,2};//0,1,2の3つの要素を持った配列

//⚫︎格納
array[0] = 10;//1つ目の枠に代入
array[1] = 20;//2つ目の枠に代入
array[2] = 30;//3つ目の枠に代入

//⚫︎取得
//array[0]でarrayの一つ目の要素を呼び出し
Debug.Log(array[0]);//1つ目の要素をコンソールで出力
using System;//Arrayメソッドを使用する場合必要

//⚫︎要素数を取得
int arrayNum;
arrayNum = array.Length; //配列arrayの要素数

//⚫︎要素番号検索(型の制限なし,ソート不要)
int[] array = {0, 1, 5};
int arrayNum;
//検索に引っかからない場合は-1
arrayNum = array.IndexOf(2); //出力は-1
arrayNum = array.IndexOf(5); //出力は2

//⚫︎要素番号検索(整数のみ,ソート必要)
int[] array = {0, 1, 5};
int arrayNum;
//検索に引っかからない場合は -(入るべき要素の場所 + 1)
arrayNum = Array.BinarySearch(array, 2); //出力は-3
arrayNum = Array.BinarySearch(array, 5); //出力は2

//⚫︎データリセット(デフォルト値に戻すのでint等は0、booleanはfalse、stringや参照型はnullに)
int[] array = {0, 1, 5};
//範囲指定してリセット(リセットする配列, 開始要素番号, リセットする数)
Array.Clear(array, 0, 2); //array = {0, 0, 5};の状態になる

//⚫︎配列複製
int[] array = {0, 1, 5};
//int等は完全な独立した複製配列、stringや参照型は同じ参照を持った配列(元の要素に変更を加えたらどちらも変わる)
int[] cloneArray = (int[])array.Clone();

//⚫︎要素コピー(範囲外などエラーが起きてもそのまま)
int[] sourceArray = {0, 1, 5, 9, 10};
int[] array = {0, 1, 2, 3, 4};
//引数(コピーする元の配列, コピーされる配列, コピーする数);
Array.Copy(sourceArray, array, 3); // array = {0, 1, 5, 3, 4};のようになる
//要素[0]から3要素(0, 1, 5)がコピーされる

//⚫︎要素コピー(エラーが起きると元の配列に戻る)
int[] sourceArray = {0, 1, 5, 9, 10};
int[] array = {0, 1, 2, 3, 4};
//引数(コピーする元の配列, コピーを開始する要素番号, コピーされる配列, コピーを開始する要素番号, コピーする数);
Array.ConstrainedCopy(sourceArray, 0, array, 1, 3); // array = {0, 0, 1, 5, 4};のようになる
//要素[0]から3要素(0, 1, 5)が要素[1]からコピーされる
配列内をシャッフル
void Start()
{
    int[] array = {0,1,2,3,4,5,6,7,8,9};
    ShuffleArray(array);
}

public void ShuffleArray(int[] array)
{
    int arrayLength = array.Length;
    while (arrayLength > 1)
    {
      arrayLength--;
      int randomNum = UnityEngine.Random.Range(0, arrayLength + 1); // Random.Rangeを使用
      int value = array[randomNum];
      array[randomNum] = array[arrayLength];
      array[arrayLength] = value;
    }
}
その他メソッド
//⚫︎型を変換する(intからstring)
int[] array = { 0, 1, 2, 3, 4 };
string[] stringArray = Array.ConvertAll(array, element => element.ToString());

//⚫︎コピーする(コピー先の開始要素を指定)
int[] sourceArray = { 1, 2, 3, 4, 5 };
int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// sourceArray の内容を array の要素[3]から開始してコピー
sourceArray.CopyTo(array, 3);

//⚫︎空の配列を作成
int[] emptyArray = Array.Empty<int>();

//⚫︎条件に満たす要素があるか確認する
int[] array = { 0, 1, 2, 3, 4 };
bool array4 = Array.Exists(array, n => n == 4);
Debug.Log(array4);//出力true

//⚫︎条件に満たす最初の要素を取得する
int[] array = { 5, 1, 2, 3, 4 };
int result = Array.Find(numbers, x => x % 2 == 0);
Debug.Log(result);//出力2
//参照型も可能
public class Human
{
    public string name;
    public int age;
}
Human[] humanArray;
Person findPerson = Array.Find(humanArray, human => human.name == "Doraemo");
//FindAllで複数の要素を格納することも可能

リスト

宣言
// [SerializeField]を頭につけるとインスペクター上で確認できる
List<GameObject> list = new List<GameObject>();
要素の追加削除
//リストに追加(一番後ろに追加)
list.Add(obj);
//指定した要素を削除(オブジェクトはなくならず、参照が削除される)
list.Remove(obj);
//指定した番号の要素を削除(オブジェクトはなくならず、参照が削除される)
list.RemoveAt(0);
//リストの中身を全て削除する(オブジェクトはなくならず、参照が削除される)
list.Clear();
//リストの任意の場所に追加(元あった要素は後ろにずれる)
list.Insert(0, obj);
要素数を取得
int listNum;
listNum = list.Count;//リストの要素数
要素を取得
//list[0]でlistの一つ目の要素を呼び出し
Debug.Log(list[0]);//1つ目の要素をコンソールで出力
リストの中身をソート
//リストの型が参照型であればその変数でソートが可能(順番が変わるので注意)

public class Human
{
 public int age;
 public string name;
}

List<Human> humanList = new List<Human>();
//リスト内のint型を昇順でソート
humanList.Sort((a, b) => a.age - b.age);
//リスト内のint型を降順でソート
humanList.Sort((a, b) => b.age - a.age);
//リスト内のstring型を昇順でソート
humanList.Sort((a, b) => string.Compare(a.name, b.name));
//リスト内のstring型を昇順でソート
humanList.Sort((a, b) => string.Compare(b.name, a.name));
//memo
if(listDawnOrUp)cropChangeList.Sort((a, b) => b.CompareTo(a));
else cropChangeList.Sort((a, b) => a.CompareTo(b));
Linqを使ってリストの機能を拡張する
using System.Linq;

//list1とlist2の被った要素だけ追加したリストを作成
List<GameObject> lists = list1.Intersect(list2).ToList();
//

//その他もろもろの処理がある

二次元配列

二次元配列(インスペクターで確認できない)
int[ , ] dimensionsArray = new int[5,3];//5行3列の二次元配列
Debug.Log(array[0,0]);//1行1列目の枠をコンソールで出力
ジャグ配列(独立した配列の配列、インスペクターで確認できない)
int[][] jaggedArray = new int[3][]; 
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[3];
jaggedArray[2] = new int[8];
Debug.Log(jaggedArray[0][0]);//1行1列目の枠をコンソールで出力
二次元配列もどき(インスペクターで確認できる)
[System.Serializable]
public class Human
{
    [SerializeField] public string humName;
    [SerializeField] public int age;
    [SerializeField] public int power;
}

public class HumanManager : MonoBehaviour
{
    [SerializeField] public Human[] humList = new Human[10];
}

ディクショナリー

参考記事(配列):https://www.sejuku.net/blog/56077
参考記事(二次元配列):https://gametukurikata.com/csharp/jaggedarray
参考記事(リストソート):https://www.wwwmaplesyrup-cs6.work/entry/2019/11/08/130507
参考資料(Microsoft .Net 8):https://learn.microsoft.com/ja-jp/dotnet/api/system.array?view=net-8.0

コメント

タイトルとURLをコピーしました