Вложенный цикл, такой как @ live627, будет работать, если у вас уже есть существующая карта тайлов. Вы всегда хотите проверить после создания? Потому что вы отображаете их как красный / синий в то же время, когда вы их генерируете. Это сэкономит вам немного вычислительного времени. Однако это работает только на четной сетке.
Grid.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Grid : MonoBehaviour
{
public int gridSize = 10;
public Tile tilePrefab;
void Start() {
SetGrid();
}
public void SetGrid() {
int total = gridSize * gridSize;
for(int i = 0; i < total; i++) {
int posX = (int)Mathf.Floor(i/gridSize);
int posY = i % gridSize;
Tile t = Instantiate(tilePrefab).GetComponent<Tile>();
t.SetPosition(posX, posY);
if((posX + posY) % 2 == 0)
t.SetColor(Color.blue);
else
t.SetColor(Color.red);
}
}
}
Tile.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tile : MonoBehaviour
{
public int X;
public int Y;
private Renderer m_Renderer;
private void Awake() {
this.m_Renderer = this.GetComponent<Renderer>();
}
public void SetPosition(int x, int y) {
this.X = x;
this.Y = y;
this.transform.position = new Vector3(x, y, 0);
}
public void SetColor(Color c) {
m_Renderer.material.color = c;
}
}
Это создаст сетку, которая будет генерировать шахматоподобныесетка для вас в одномерном цикле, а не во вложенном цикле.
Этот конкретный цикл:
int total = gridSize * gridSize;
for(int i = 0; i < total; i++) {
int posX = (int)Mathf.Floor(i/gridSize);
int posY = i % gridSize;
Tile t = Instantiate(tilePrefab).GetComponent<Tile>();
t.SetPosition(posX, posY);
if((posX + posY) % 2 == 0)
t.SetColor(Color.blue);
else
t.SetColor(Color.red);
}
Он может направить вас в нужное русло, если вы только хотите просмотреть свой список безвложенные циклы. Вам придется изменить это на то, что вы хотите, чтобы произошло.