さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】範囲が無制限な二次元配列

やること

 負の方向にも要素を持てて、リサイズ可能な(というか勝手にリサイズされる)二次元配列を実装する。

 やりたいこととしてはDictionary<Vector2Int, T>でいいんだけど、パフォーマンス的にもうちょいマシなものを目指す。

コード

gist.github.com

こうやって使う

var array2 = new UnlimitedArray2<string>(0, 0, 8, 8); // 8x8サイズの配列
var array2[1, 2] = "hoge"; // 二次元配列感覚で使う
var array2[50, 50] = "fuga"; // 範囲外にアクセスしても勝手にリサイズされる
var array2[-1, -1] = "piyo"; // 負の値を入れても動く

// 要素をなめる。
// この場合、i : [-1, 50], j : [-1, 50]の範囲をとる。
for (int i=array2.MinX; i<=array2.MaxX; ++i)
{
    for (int j=array2.MinY; j<=array2.MaxY; ++j)
    {
        Debug.Log(array2[i, j]);
    }
}

なお

 リサイズが起こるSetを連発されると辛くなるのは見えてるんだけど、そのへんは生成時のサイズ指定で良い感じの値を入れておいてほしい。(Listみたいに多めにキャパシティを獲得しておく手はあるんだけど、二乗で利くのでさすがに怖い)