Как динамически устанавливать плитки в тайлекарте? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть предварительно созданная карта тайлов с красными тайлами. Я хочу, чтобы можно было просмотреть мою карту тайлов, и если плитка является красной, то установите для нее синюю плитку.

У меня есть следующая идея

public Tile blue;
public Tile red;

Однако я не уверен, как обойти все плитки, а затем установить плитку рядом с ней на красный, если плитка синего цвета.

Кто-нибудь может дать мне какие-нибудь предложения?

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Вложенный цикл, такой как @ 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);
        }

Он может направить вас в нужное русло, если вы только хотите просмотреть свой список безвложенные циклы. Вам придется изменить это на то, что вы хотите, чтобы произошло.

0 голосов
/ 19 октября 2019

Вы можете использовать цикл foreach. Проверьте каждую плитку. если он красный, установите его на синий.

Если ваши плитки хранятся в 2d-массиве, то у плитки рядом с ней должно быть значение x текущей плитки + 1.

    for (int x = 0; x < gridSizeX; x++)
        for (int y = 0; y < gridSizeY; y++)
             if (grid[x, y].color == Color.red)
                 grid[x + 1, y].color = Color.blue;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...