コード例 #1
0
    private void InstantiateChunks(TERRAIN.ETerrain[,] _startTerrain)
    {
        terrainChunks       = new TerrainChunk[terrainDimension, terrainDimension];
        terrainChunkStorage = new MeshList <TerrainChunk>();
        int halfDim = GetTerrainDimCenter();

        for (int x = 0; x < terrainDimension; x++)
        {
            for (int z = 0; z < terrainDimension; z++)
            {
                terrainChunks[x, z] = new TerrainChunk(_startTerrain[x, z],
                                                       new Vector3(planetData.GetTerrainSize().x *(x - halfDim), 0, planetData.GetTerrainSize().y *(z - halfDim)) + currentCenter,
                                                       planetData.GetTerrainSize(),
                                                       this);
            }
        }



        terrainChunkStorage.SetCenter(terrainChunks[halfDim, halfDim]);
        //first do the middle line
        for (int x = 0; x < halfDim; x++)
        {
            terrainChunkStorage.AddLeft(-x, 0, terrainChunks[halfDim - x - 1, halfDim]);
            terrainChunkStorage.AddRight(x, 0, terrainChunks[halfDim + x + 1, halfDim]);
        }

        //the in parallel always do the line above and below in one set
        for (int y = 0; y < halfDim; y++)
        {
            terrainChunkStorage.AddAbove(0, y, terrainChunks[halfDim, halfDim + y + 1]);
            terrainChunkStorage.AddBelow(0, -y, terrainChunks[halfDim, halfDim - y - 1]);

            for (int x = 0; x < halfDim; x++)
            {
                terrainChunkStorage.AddLeft(-x, y + 1, terrainChunks[halfDim - x - 1, halfDim + y + 1]);
                terrainChunkStorage.AddRight(x, y + 1, terrainChunks[halfDim + x + 1, halfDim + y + 1]);
            }
            for (int x = 0; x < halfDim; x++)
            {
                terrainChunkStorage.AddLeft(-x, -(y + 1), terrainChunks[halfDim - x - 1, halfDim - y - 1]);
                terrainChunkStorage.AddRight(x, -(y + 1), terrainChunks[halfDim + x + 1, halfDim - y - 1]);
            }
        }

        ReloadChunkArrayFromStorage();

        currentStoragePosition = new Vector2Int(0, 0);
    }
コード例 #2
0
    private void MoveLoadedSectionHorizontally(bool _right)
    {
        int column;

        if (_right)
        {
            column = terrainDimension - 1;
        }
        else
        {
            column = 0;
        }

        //move the center up by one step
        if (_right)
        {
            currentStoragePosition = new Vector2Int(currentStoragePosition.x + 1, currentStoragePosition.y);
        }
        else
        {
            currentStoragePosition = new Vector2Int(currentStoragePosition.x - 1, currentStoragePosition.y);
        }

        //try to load the currently stored chunks
        ReloadChunkArrayFromStorage();

        int halfDim = GetTerrainDimCenter();

        //check if any of the loaded chunks is still null and if so, generate them
        for (int i = -halfDim; i <= halfDim; i++)
        {
            if (terrainChunks[column, i + halfDim] == null)
            {
                //Debug.Log(terrainChunks[i + halfDim, row]);
                terrainChunks[column, i + halfDim] = new TerrainChunk(TerrainData.GetRandomTerrainByFrequency(),
                                                                      new Vector3(planetData.GetTerrainSize().x *(column - halfDim), 0, planetData.GetTerrainSize().y *i) + currentCenter,
                                                                      planetData.GetTerrainSize(),
                                                                      this);

                if (_right)
                {
                    terrainChunkStorage.AddRight(currentStoragePosition.x + halfDim - 1, currentStoragePosition.y + i, terrainChunks[column, i + halfDim]);
                }
                else
                {
                    terrainChunkStorage.AddLeft(currentStoragePosition.x - halfDim + 1, currentStoragePosition.y + i, terrainChunks[column, i + halfDim]);
                }
            }
        }

        //Reload the chunks after generating the missing ones
        //ReloadChunkArrayFromStorage();
    }