Esempio n. 1
0
    public bool PopulateLevel(int[,] level, float size, LevelMeshData data)
    {
        levelPrefabMap = level;

        levelWidth  = levelPrefabMap.GetLength(0);
        levelHeight = levelPrefabMap.GetLength(1);

        sizeMultipler = size;
        levelMeshData = data;


        availibleLevel.Clear();
        bigSpots.Clear();
        mediumSpots.Clear();
        smallSpots.Clear();
        fences.Clear();

        if (!FindSpots())
        {
            return(false);
        }
        PlaceFences();

        PopulateSpot(smallSpots, PrefabSize.Small);
        PopulateSpot(mediumSpots, PrefabSize.Medium);
        PopulateSpot(bigSpots, PrefabSize.Large);

        return(true);
    }
Esempio n. 2
0
    public bool GenerateLevel()
    {
        level = new int[width, height];
        RandomFillLevel();
        for (int i = 0; i < smoothAmount; i++)
        {
            SmoothLevel();
        }

        ProcessLevel();

        int borderSize = 1;

        int[,] borderedLevel = new int[width + borderSize * 2, height + borderSize * 2];

        for (int x = 0; x < borderedLevel.GetLength(0); x++)
        {
            for (int y = 0; y < borderedLevel.GetLength(1); y++)
            {
                if (x >= borderSize && x < width + borderSize && y >= borderSize && y < height + borderSize)
                {
                    borderedLevel[x, y] = level[x - borderSize, y - borderSize];
                }
                else
                {
                    borderedLevel[x, y] = 0;
                }
            }
        }

        LevelMeshGenerator meshGen = GetComponent <LevelMeshGenerator>();

        levelMeshData = meshGen.GenerateMesh(borderedLevel, sizeMultiplier);

        LevelPopulation popGen = GetComponent <LevelPopulation>();

        popGen.DepopulateLevel();
        if (populateLevel)
        {
            if (!popGen.PopulateLevel(borderedLevel, sizeMultiplier, levelMeshData))
            {
                fillAmount++;
                GenerateLevel();
            }
        }

        if (generateGrid)
        {
            Grid pathfindingGrid = GetComponent <Grid>();
            pathfindingGrid.CreateGrid();
        }
        return(true);
    }
Esempio n. 3
0
    //18:45 EP4

    public LevelMeshData GenerateMesh(int[,] level, float squareSize)
    {
        triangleDict.Clear();
        outlines.Clear();
        checkedVerts.Clear();
        squareGrid = new SquareGrid(level, squareSize);

        vertices          = new List <Vector3>();
        triangles         = new List <int>();
        solidVertices     = new List <int>();
        solidEdgeVertices = new List <int>();
        edgeTriangles     = new List <int>();

        for (int x = 0; x < squareGrid.squares.GetLength(0); x++)
        {
            for (int y = 0; y < squareGrid.squares.GetLength(1); y++)
            {
                TriangulateSquare(squareGrid.squares[x, y]);
            }
        }

        CalculateMeshOutlines();

        Mesh mesh = new Mesh();

        floor.GetComponent <MeshFilter>().mesh = mesh;

        mesh.vertices  = vertices.ToArray();
        mesh.triangles = triangles.ToArray();
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        Vector2[] uvs = new Vector2[vertices.Count];
        for (int i = 0; i < uvs.Length; i++)
        {
            float percentX = Mathf.InverseLerp(-level.GetLength(0) / 2 * squareSize, level.GetLength(0) / 2 * squareSize, vertices[i].x) * tileAmountX;
            float percentY = Mathf.InverseLerp(-level.GetLength(1) / 2 * squareSize, level.GetLength(1) / 2 * squareSize, vertices[i].z) * tileAmountY;
            uvs[i] = new Vector2(percentX, percentY);
        }

        mesh.uv = uvs;

        if (generateColliders)
        {
            floor.GetComponent <MeshCollider>().sharedMesh = null;
            floor.GetComponent <MeshCollider>().sharedMesh = mesh;
        }

        Mesh edgeMesh = new Mesh();

        edges.mesh = edgeMesh;



        edgeMesh.vertices  = vertices.ToArray();
        edgeMesh.triangles = edgeTriangles.ToArray();
        edgeMesh.RecalculateNormals();
        edgeMesh.RecalculateBounds();

        List <int> edgeVertices = new List <int>();

        Vector2[] edgeUVs = new Vector2[vertices.Count];

        foreach (List <int> outline in outlines)
        {
            for (int i = 0; i < outline.Count; i++)
            {
                if (!solidVertices.Contains(outline[i]))
                {
                    edgeVertices.Add(outline[i]);
                }

                //uvs[outline[i]] = new Vector2(0, 0);
            }
        }

        for (int i = 0; i < edgeVertices.Count; i++)
        {
            edgeUVs[edgeVertices[i]] = new Vector2(0, 1f);
        }

        edgeMesh.uv  = uvs;
        edgeMesh.uv2 = edgeUVs;

        if (generateColliders)
        {
            edges.GetComponent <MeshCollider>().sharedMesh = null;
            edges.GetComponent <MeshCollider>().sharedMesh = edgeMesh;
        }

        CreateWallMesh(level, squareSize);

        LevelMeshData levelData = new LevelMeshData();

        levelData.vertices = vertices;

        List <Vector3> solidVerts = new List <Vector3>();

        foreach (int i in solidVertices)
        {
            solidVerts.Add(vertices[i]);
        }

        levelData.solidVertices = solidVerts;

        List <Vector3> edgeVerts = new List <Vector3>();

        foreach (int i in edgeVertices)
        {
            edgeVerts.Add(vertices[i]);
        }

        List <Vector3> solidEdgeVerts = new List <Vector3>();

        foreach (int i in solidEdgeVertices)
        {
            solidEdgeVerts.Add(vertices[i]);
        }


        levelData.solidEdgeVertices = solidEdgeVerts;

        levelData.edgeVertices = edgeVerts;

        return(levelData);
    }