У меня есть List в котором хранятся все клетки на игровом поле, у каждой клетки есть два состояния - проходима или нет (стена). Так как для генерации поля используется клеточный автомат, то некоторые "комнаты" оказываются изолированными. Собственно, попробовал написать алгоритм, который бы проходил по коллекции и создавал комнаты из клеток, но, судя по всему компилятор ругается на то, что нельзя изменять коллекцию (очередь) в момент работы с ней. Вот код тех моментов, которые вызывают ошибку.
public List<Room> rooms;
public List<GameObject> cells;
public void CreateRooms ()
{
int numberOfRooms = 0;
foreach (GameObject cell in cells)
{
if (cell.GetComponent<Cell>().isWall == false && cell.GetComponent<Cell>().state == "free")
{
rooms[numberOfRooms] = GenerateRoom(cell);
numberOfRooms++;
}
}
}
public Room GenerateRoom (GameObject startCell)
{
int cellInRoom = 0;
List<GameObject> newRoom = new List<GameObject>();
Room room = new Room();
Queue<GameObject> stack = new Queue<GameObject>();
stack.Enqueue(startCell);
do
{
GameObject temp = stack.Dequeue();
List<GameObject> TempList = new List<GameObject>();
TempList = temp.GetComponent<Cell>().idleNeighbors;
for (int i = 0; i < TempList.Count; i++ )
{
newRoom[cellInRoom] = TempList[i];
cellInRoom++;
stack.Enqueue(TempList[i]);
}
} while (stack.Count != 0);
for (int i = 0; i < newRoom.Count; i++)
{
room.room.Add(newRoom[i]);
}
return room;
}
ArgumentOutOfRangeException
возникает не при изменении очереди, а когда индекс элемента, к которому вы обращаетесь, выходит за границы очереди. В вашем случае это, видимо, происходит в строке
newRoom[cellInRoom] = TempList[i];
т.к. список newRoom
определен без заданного количества элементов
List<GameObject> newRoom = new List<GameObject>();
Соответственно, в нем нет элементов, и при обращении к первому элементу возникает исключение.
Используйте метод Add()
класса List
newRoom.Add(TempList[i]);
P.S. Не называйте экземпляр класса Queue
именем stack
, строчка stack.Enqueue(TempList[i]);
режет глаз, все-таки стэк и очередь разные понятия
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть две программы Server и ClientClient знает о функциях сервера и хочет их вызвать
Есть проект, назовём его testProject и есть проект Unittest нужно что бы проект Unittest видел папку Models из проекта testProject, как это сделать?