Пример #1
0
    void ReloadMaze()
    {
        if (mazeInstance != null)
        {
            Destroy(mazeInstance);
            squares.Clear();
        }

        mazeInstance = new GameObject("Instance");
        mazeInstance.transform.parent        = transform;
        mazeInstance.transform.localPosition = Vector3.zero;

        squares = SprawlGeneratorLogic.Generate(outlets, isFlat, size, spread, turnFrequency, deadEndFrequency);

        for (int i = 0; i < squares.Count - 2; i++)
        {
            SprawlerSquare square = squares[i];

            square.layout = SprawlGeneratorLogic.BuildSquare(square, prefabs, sq);

            square.layout.transform.parent        = mazeInstance.transform;
            square.layout.transform.localPosition = SprawlGeneratorLogic.SquarePosition(square, sq.GetComponent <PrefabDimensions>());

            square.layout.name = "Sq" + square.coordinates.ToString();
        }

        for (int i = squares.Count - 2; i < squares.Count; i++)
        {
            squares[i].layout = Instantiate(i == squares.Count - 2 ? entrance : exit, mazeInstance.transform);

            squares[i].layout.transform.localPosition = SprawlGeneratorLogic.SquarePosition(squares[i], sq.GetComponent <PrefabDimensions>());
        }
    }
Пример #2
0
    static List <SprawlerSquare> AddOutlets(SprawlerSquare[] outlets, List <SprawlerSquare> squares)
    {
        List <Vector3> OutletCoordinates = new List <Vector3>();

        foreach (SprawlerSquare square in squares)
        {
            for (int i = 0; i < directions2D.Length; i++)
            {
                if (square.adjacents[i] == null)
                {
                    OutletCoordinates.Add(square.coordinates + directions2D[i]);
                }
            }
        }

        for (int i = 0; i < outlets.Length; i++)
        {
            outlets[i] = new SprawlerSquare(OutletCoordinates[Random.Range(0, OutletCoordinates.Count)]);

            OutletCoordinates.Remove(outlets[i].coordinates);

            squares.Add(outlets[i]);
        }

        return(squares);
    }
Пример #3
0
    public static Vector3 SquarePosition(SprawlerSquare square, PrefabDimensions dimensions)
    {
        Vector3 position = new Vector3(
            square.coordinates.x * dimensions.width,
            square.coordinates.y * dimensions.height,
            square.coordinates.z * dimensions.length
            );

        return(position);
    }
Пример #4
0
    public static GameObject BuildSquare(SprawlerSquare square, LevelPrefabs prefabs, GameObject sqPrefab)
    {
        GameObject output = Object.Instantiate(sqPrefab);

        GameObject currentPrefab;

        for (int i = 0; i < square.adjacents.Length; i++)
        {
            currentPrefab = i < 4 ? prefabs.wall :
                            i == 4 ? prefabs.ceiling : prefabs.floor;

            if (square.adjacents[i] == null)
            {
                Object.Instantiate(currentPrefab, output.transform.GetChild(i));
            }
        }

        return(output);
    }
Пример #5
0
    public static List <SprawlerSquare> Generate(SprawlerSquare[] outlets, bool isFlat, int numSquares, Vector3 spread, float turnFrequency, float deadEndFrequency)
    {
        List <SprawlerSquare> squares        = new List <SprawlerSquare>();
        List <Vector3>        allCoordinates = new List <Vector3>();

        Vector3        newCoordinates;
        SprawlerSquare newSquare;

        Vector3[] directions = isFlat ? directions2D : directions3D;

        int capacity = Capacity(spread, isFlat);

        if (capacity <= numSquares)
        {
            squares = FillSpread(spread, squares);

            for (int i = 0; i < squares.Count; i++)
            {
                allCoordinates.Add(squares[i].coordinates);
            }
        }
        else
        {
            //Origin square
            newCoordinates = Vector3.zero;
            newSquare      = new SprawlerSquare(newCoordinates);
            squares.Add(newSquare);
            allCoordinates.Add(newCoordinates);

            Vector3 direction = Direct(directions);
            float   turn      = 1;
            float   deadEnd   = 1;

            for (int i = 1; i < numSquares; i++)
            {
                turn    = Random.Range(0, 1f);
                deadEnd = Random.Range(0, 1f);

                //Direction change
                if (turn < turnFrequency)
                {
                    direction = Direct(directions);
                }

                //Dead end
                if (deadEnd < deadEndFrequency)
                {
                    newCoordinates = allCoordinates[Random.Range(0, allCoordinates.Count)];
                    direction      = Direct(directions);
                }

                newCoordinates += direction;

                //If hit another block or boundary
                if (allCoordinates.Contains(newCoordinates) || HitBoundary(newCoordinates, spread))
                {
                    Vector3 backtrack = newCoordinates - direction;
                    Vector3 dir       = Redirect(backtrack, allCoordinates, directions, spread);

                    //Anywhere to go?
                    if (dir == Vector3.zero)
                    {
                        newCoordinates = allCoordinates[Random.Range(0, allCoordinates.Count)];
                        direction      = Direct(directions);
                    }
                    else
                    {
                        direction      = dir;
                        newCoordinates = backtrack + dir;
                    }
                }

                newSquare = new SprawlerSquare(newCoordinates);

                squares.Add(newSquare);
                allCoordinates.Add(newCoordinates);
            }
        }

        //Store adjacent squares
        StoreAdjacents(squares, allCoordinates);

        //Add outlets
        squares = AddOutlets(outlets, squares);

        return(squares);
    }