Ejemplo n.º 1
0
    public void LoadTiles(Vector3 position)
    {
        (int xMin, int xMax, int zMin, int zMax) = CalcBoundaries(position, CHUNK_RENDER_DISTANCE, CHUNK_SIZE);

        for (int i = xMin; i < xMax; i += CHUNK_SIZE)
        {
            for (int j = zMin; j < zMax; j += CHUNK_SIZE)
            {
                Vector3 newChunkPosition = new Vector3(i, 0, j);
                Vector3 playerPosV3      = GameObject.FindGameObjectWithTag("Player").transform.position;
                Vector2 playerPosV2      = new Vector2(playerPosV3.x, playerPosV3.z);

                float xzDistance    = Vector2.Distance(new Vector2(i, j), playerPosV2);
                int   levelOfDetail = CalculateLevelOfDetail(xzDistance);

                if (tileDict.ContainsKey(newChunkPosition))
                {
                    if (tileDict[newChunkPosition].LevelOfDetail != levelOfDetail)
                    {
                        // Regenerate the terrain mesh if the level of detail is different
                        Tile tile = tileDict[newChunkPosition];
                        tile.LevelOfDetail = levelOfDetail;
                        tileBuilder.RegenerateMesh(tile);
                    }
                }
                else
                {
                    // Generate new tile
                    Tile    tile            = objectPool.GetPooledTile();
                    Vector3 terrainPosition = new Vector3(newChunkPosition.x + 5, 0, newChunkPosition.z + 5);
                    Vector3 cavePosition    = new Vector3(newChunkPosition.x + 5, -30, newChunkPosition.z + 5);

                    tile.Terrain.GameObject.transform.position = terrainPosition;
                    tile.Cave.GameObject.transform.position    = cavePosition;

                    tileDict.Add(newChunkPosition, tile);

                    tile.LevelOfDetail = levelOfDetail;
                    tileBuilder.Instantiate(newChunkPosition);
                }
            }
        }
    }