うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【Unity】Array の サイズ変更

UnityEditor

UnityEditor 上でのみの配列操作なら ArrayUtility が利用できるのでこちらを利用します
UnityEditor.ArrayUtility - Unity スクリプトリファレンス

using UnityEditor;

    private void ArrayControl()
    {
        int[] _array = new int[0];
        // 追加
        ArrayUtility.Add(ref _array, 1);
        // 複数追加
        ArrayUtility.AddRange(ref _array, new[]{1, 2});
        // 指定の要素を削除
        ArrayUtility.Remove(ref _array, 1);
        // 指定のインデックスを削除
        ArrayUtility.RemoveAt(ref _array, 0);
        // Array を初期化
        ArrayUtility.Clear(ref _array);
        // 含まれるか
        ArrayUtility.Contains(_array, 1);
        // 要素を検索
        var index = ArrayUtility.FindIndex(_array, i => i == 9);
        // 指定した場所に追加
        ArrayUtility.Insert(ref _array, 1, 1);
        // 対象のIndex
        ArrayUtility.IndexOf(_array, 1);
        // 対象の最後のIndex
        ArrayUtility.LastIndexOf(_array, 1);
    }

Runtime

ArrayUtility のをそのまま持ってくればいいけど、Runtimeでは利用できないので
一部機能のみ実装してみました

ArrayUtilityでは使っていたボクシングの処理周りは削除しました

public static class RuntimeArrayUtil
{
    public static void Add<T>(ref T[] array, T item)
    {
        System.Array.Resize(ref array, array.Length + 1);
        array[array.Length - 1] = item;
    }
 
    public static void Insert<T>(ref T[] array, T item, int index)
    {
        System.Array.Resize(ref array, array.Length + 1);
        var length = array.Length;
        for (var i = index; i < length - 1; i++)
        {
            array[i + 1] = array[i];
        }
        array[index] = item;
    }
 
    public static void Remove<T>(ref T[] array, T item)
    {
        var index = FindIndex(array, item);
        if (index < 0)
            return;

        var length = array.Length;
        for (var i = index; i < length - 1; i++)
        {
            array[i] = array[i + 1];
        }
        System.Array.Resize(ref array, length - 1);
    }
 
    public static void RemoveAt<T>(ref T[] array, int index)
    {
        Remove(ref array, array[index]);
    }
 
    public static int FindIndex<T>(T[] array, T item)
    {
        var index = -1;
        for (int i = 0; i < array.Length; i++)
        {
            if (!array[i].Equals(item))
                continue;

            return i;
        }
        return index;
    }
 
    public static void Clear<T>(ref T[] array)
    {
        System.Array.Clear(array, 0, array.Length);
        System.Array.Resize(ref array, 0);
    }
 
    public static bool Contains<T>(T[] array, T item)
    {
        return FindIndex(array, item) >= 0;
    }
}
   private void ArrayControl()
    {
        int[] _array = new int[]{1, 2, 3, 4, 5};

        // 追加
        RuntimeArrayUtil.Add(ref _array, 6);
        // 指定の要素を削除
        RuntimeArrayUtil.Remove(ref _array, 1);
        // 指定のインデックスを削除
        RuntimeArrayUtil.RemoveAt(ref _array, 0);
        
        // 含まれるか
        RuntimeArrayUtil.Contains(_array, 5);
        RuntimeArrayUtil.Contains(_array, 10);

        // 要素を検索
        var index = RuntimeArrayUtil.FindIndex(_array, 5);
        // 指定した場所に追加
        RuntimeArrayUtil.Insert(ref _array, 10, 1);
        // Array を初期化
        RuntimeArrayUtil.Clear(ref _array);
    }