void Awake() { startPos = center - (size / 2); // Размеры поля arrSizeX = Mathf.RoundToInt(size.x / nodeSize); arrSizeY = Mathf.RoundToInt(size.z / nodeSize); // Заполняем поле ячейками if (arrSizeX > 0 && arrSizeY > 0) { grid = new PathNode[arrSizeX, arrSizeY]; for (int i = 0; i < arrSizeY; i++) { for (int j = 0; j < arrSizeX; j++) { grid[i, j] = new PathNode { coo = new Vector3((i + nodeSize / 2), nodeSize / 2, (j + nodeSize / 2)) + startPos, IsEmpty = true }; grid[i, j].obj = Instantiate(prefabNode, grid[i, j].coo, new Quaternion(0, 0, 0, 0), parentNode); } } } // Статичные препятствия RaycastHit hit; for (int i = 0; i < arrSizeY; i++) { for (int j = 0; j < arrSizeX; j++) { Physics.BoxCast(grid[j, i].coo + new Vector3(0, 50, 0), new Vector3(nodeSize / 2, nodeSize / 2, nodeSize / 2), new Vector3(0, -100, 0), out hit); if (hit.collider != null && hit.collider.gameObject.tag == "Barrier") { grid[j, i].obj.GetComponent <MeshRenderer>().material = notEmptyMaterial; grid[j, i].IsEmpty = false; } } } // Инициализация зон countZoneX = (int)(arrSizeX / zoneSize); countZoneY = (int)(arrSizeY / zoneSize); zones = new PathZone[countZoneY, countZoneX]; for (int i = 0; i < countZoneY; i++) { for (int j = 0; j < countZoneX; j++) { zones[i, j] = new PathZone { id = i * countZoneX + j }; } } // Соседние зоны for (int i = 0; i < countZoneY; i++) { for (int j = 0; j < countZoneX; j++) { zones[i, j].neighbors = FindNeighBors(i, j); } } // Установка входов и выходов PathZone zone1; PathZone zone2; /* * for (int i = 0; i < countZoneY; i++) { * for (int j = 0; j < countZoneX; j++) { * Debug.Log(zones[i, j].id); * } * }*/ for (int i = 1; i < countZoneY; i++) { for (int j = 0; j < arrSizeX; j++) { zone1 = GetZoneByNode(i * zoneSize - 1, j); zone2 = GetZoneByNode(i * zoneSize, j); if (grid[i * zoneSize - 1, j].IsEmpty && grid[i * zoneSize, j].IsEmpty) { zone1.exits.Add(new PathExit { enter = zone2, PathNodeEnter = grid[i * zoneSize - 1, j], PathNodeExit = grid[i * zoneSize, j], }); zone2.exits.Add(new PathExit { enter = zone1, PathNodeEnter = grid[i * zoneSize, j], PathNodeExit = grid[i * zoneSize - 1, j] }); } } } for (int i = 1; i < countZoneX; i++) { for (int j = 0; j < arrSizeY; j++) { zone1 = GetZoneByNode(j, i * zoneSize - 1); zone2 = GetZoneByNode(j, i * zoneSize); if (grid[j, i *zoneSize - 1].IsEmpty && grid[j, i *zoneSize].IsEmpty) { zone1.exits.Add(new PathExit { enter = zone2, PathNodeEnter = grid[j, i * zoneSize - 1], PathNodeExit = grid[j, i * zoneSize], }); zone2.exits.Add(new PathExit { enter = zone1, PathNodeEnter = grid[j, i * zoneSize], PathNodeExit = grid[j, i * zoneSize - 1] }); } } } /* * foreach (PathZone zone in zones) { * Debug.Log(zone.id); * } */ foreach (PathExit exit in GetZoneByNode(37, 37).exits) { exit.PathNodeEnter.obj.GetComponent <MeshRenderer>().material = borderMaterial; } /* foreach (PathZone zone in FindNeighBors(1, 1)) { * Debug.Log(zone.id); * } */ /* Вот тут можно завтра попробовать добавить юнит тесты, они тут подойдут как ничто другое * Debug.Log(GetZoneByNode(35, 14).id); * */ }