Я пытаюсь создать игру на память с 24 карточками, в которой нужно найти пары. Итак, у меня есть 12 готовых карточных объектов, которые должны появляться в случайном порядке в сетке. Я искал в Интернете, и у меня сработало создание сетки с использованием цикла for и Instantiate для создания объектов в разных позициях (строки и столбцы), пока я не получу 24 объекта. Дело в том, что я не могу найти способ создать список из 12 префабов и копию каждого.
Я пытался найти другой метод или как создать экземпляр целого списка объектов, но я нашел только то, как это сделать, создав индекс и Random.Range списка, но это не то, что я хочу, потому что мне нужны все карты и по два раза каждая. Вот как мой код выглядит прямо сейчас.
public class GridManager : MonoBehaviour
{
public int columnLenght;
public int rowLenght;
public float x_Space;
public float y_Space;
public float x_Start;
public float y_Start;
public float z_Start;
public List<GameObject> cardPrefabs;
// Start is called before the first frame update
void Start()
{
for (int i = 0; i < columnLenght * rowLenght; i++)
{
int index = Random.Range(0, cardPrefabs.Count);
Instantiate(cardPrefabs[index], new Vector3(x_Start + (x_Space * (i % columnLenght)), y_Start + (-y_Space * (i / columnLenght)), z_Start + (0)), Quaternion.Euler(270, 0, 0));
}
}
Как я могу создать 12 префабов * 2 в случайном порядке в сетке?
Код, который вы написали, почти готов. После того, как вы выберете и создадите следующую карту, вы можете перейти в список и удалить карту (в индексе или самом объекте).
int index = Random.Range(0, cardPrefabs.Count);
Instantiate(cardPrefabs[index], new Vector3(x_Start + (x_Space * (i % columnLenght)), y_Start + (-y_Space * (i / columnLenght)), z_Start + (0)), Quaternion.Euler(270, 0, 0));
cardPrefabs.RemoveAt(index);
Если вам нужно сбросить игру несколько раз, я бы порекомендовал сделать копию списка, чтобы сохранить карты для следующего раза.
Что касается необходимости появления каждой карты дважды, вы можете просто добавить каждую карту в список два раза. Если вы хотите быть ленивым, как программист, вы также можете заставить компьютер делать это за вас программно.
cardPrefabs.Add(cardPrefabs);//only call this once at Start
Это не очень важно, но вы можете улучшить цикл for и сделать его немного более удобным для чтения, перебирая x и y сетки вместо того, чтобы использовать один i и вычислять координаты каждый раз.
for (int x = 0; x < columnLenght; x++)
{
for (int y = 0; y < rowLenght; y++)
{
int index = Random.Range(0, cardPrefabs.Count);
Instantiate(cardPrefabs[index], new Vector3(x_Start + (x_Space * x), y_Start + (-y_Space * y), z_Start), Quaternion.Euler(270, 0, 0));
cardPrefabs.RemoveAt(index);
}
}
Большое спасибо!! Решение оказалось намного проще, чем я думал, работает отлично. И улучшение для цикла также очень помогло сделать код более читабельным. Спасибо!