public static ArrayGrid <T> MapToSubGrid <T>(this ArrayGrid <T> grid, Vector2Int sourceAreaPos, Vector2Int sourceAreaSize, Vector2Int subGridSize, bool clampOutOfBounds = true) { if (!clampOutOfBounds) { if (!grid.IsValidPosition(sourceAreaPos)) { return(new ArrayGrid <T>()); } if (!grid.IsValidPosition(sourceAreaPos + sourceAreaSize - Vector2Int.one)) { return(new ArrayGrid <T>()); } } else { sourceAreaPos.Clamp(Vector2Int.zero, grid.MaxValidPosition); Vector2Int sourceAreaMax = sourceAreaPos + sourceAreaSize; sourceAreaMax.Clamp(Vector2Int.zero, grid.Size); sourceAreaSize = sourceAreaMax - sourceAreaPos; if (sourceAreaSize.x <= 0 || sourceAreaSize.y <= 0) { return(new ArrayGrid <T>()); } } ArrayGrid <T> subGrid = new ArrayGrid <T>(subGridSize); var subGridIter = subGrid.GetEnumerator2D(); Vector2 scale = new Vector2((float)sourceAreaSize.x / subGridSize.x, (float)sourceAreaSize.y / subGridSize.y); while (subGridIter.MoveNext()) { Vector2Int subCurrent = subGridIter.Current; Vector2 scaledSubCurrent = new Vector2(subCurrent.x * scale.x, subCurrent.y * scale.y); Vector2Int sourcePos = sourceAreaPos + Vector2Int.FloorToInt(scaledSubCurrent); subGrid[subCurrent] = grid[sourcePos]; } return(subGrid); }