通常 x と y のループを回す場合は下記のように for を2回使ってループを回す
がインデントが上がってしまうので面倒だと思い foreach 一度でループできるようにしてみました
for (var x = 0; x < hogeX; x++) { for (var y = 0; y < hogeY; y++) { } }
using System.Collections.Generic; using System.Linq; using UnityEngine; public static class LoopExtension { public static IEnumerable<T> XYLoop<T>(T[][] tArray, bool isXBase = true) { return XYLoop(tArray.GetLength(0), tArray.GetLength(1), isXBase) .Select(vi => tArray[vi.x][vi.y]); } /// <param name="xCount"></param> /// <param name="yCount"></param> /// <param name="isXBase">Xからループさせるか</param> /// <returns></returns> public static IEnumerable<Vector2Int> XYLoop(int xCount, int yCount, bool isXBase = true) { var list = new List<Vector2Int>(xCount * yCount); if (isXBase) { for (var x = 0; x < xCount; x++) for (var y = 0; y < yCount; y++) list.Add(new Vector2Int(x, y)); } else { for (var y = 0; y < yCount; y++) for (var x = 0; x < xCount; x++) list.Add(new Vector2Int(x, y)); } return list; } }
これを利用すると下記のようにすることで XY の値が取得できます
が、Linq を利用しているのでループ回数が多ければ GC が多く発生してしまうのが辛いところです
foreach (var pos in LoopExtension.XYLoop(2, 2)) { Debug.Log(pos); }