示例#1
0
    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);
         *
         */
    }