Exemplo n.º 1
0
    public void Start()
    {
        // Calculate the closest bound.
        float maximumDistance = calculatePosition(uExtent, -vExtent).magnitude;

        for (int count = 0; count < numberOfCircles; count++)
        {
            Circle circle = new Circle();

            circle.position = Random.insideUnitCircle * (maximumDistance - circleRadiusMaximum);
            circle.radius   = Random.Range(circleRadiusMinimum, circleRadiusMaximum);

            circles.Add(circle);
        }

        // Shuffle the list of coordinates.
        List <Coordinate> coordinates = new List <Coordinate>();

        for (int v = -vExtent; v <= vExtent; v++)
        {
            for (int u = -uExtent; u <= uExtent; u++)
            {
                coordinates.Add(new Coordinate(u, v));
            }
        }

        ListRandom.shuffle(coordinates);

        // Place tiles.
        foreach (Coordinate coordinate in coordinates)
        {
            Vector3    position = calculatePosition(coordinate.u, coordinate.v);
            Quaternion rotation = Quaternion.identity;

            position.y = calculateHeight(coordinate.u, coordinate.v);

            if (accept(position))
            {
                HexTile hexTile = Instantiate(selectHexTile(coordinate.u, coordinate.v), position, rotation, transform);
                hexTile.transform.localScale = new Vector3(scale, scale, scale);
                hexTile.name = "HexTile " + coordinate.u + " " + coordinate.v;

                hexTiles.Add(coordinate, hexTile);
            }
        }

        // Make borders.
        for (int count = 0; count < borderWidth; count++)
        {
            HashSet <Coordinate> borderCoordinates = new HashSet <Coordinate>();

            foreach (Coordinate coordinate in hexTiles.Keys)
            {
                borderCoordinates.UnionWith(calculateBorder(coordinate.u, coordinate.v));
            }

            foreach (Coordinate borderCoordinate in borderCoordinates)
            {
                Vector3    position = calculatePosition(borderCoordinate.u, borderCoordinate.v);
                Quaternion rotation = Quaternion.identity;

                position.y = calculateHeight(borderCoordinate.u, borderCoordinate.v);

                HexTile hexTile = Instantiate(selectBorderHexTile(borderCoordinate.u, borderCoordinate.v), position, rotation, transform);
                hexTile.transform.localScale = new Vector3(scale, scale, scale);
                hexTile.name = "Border HexTile " + borderCoordinate.u + " " + borderCoordinate.v;

                hexTile.border = true;

                hexTiles.Add(borderCoordinate, hexTile);
            }
        }

        // Build surface.
        generateSurface();
    }