private Chunk GenerateChunk(ChunkSpacePosition position) { int arrayX = (position.x - worldViewPositionX) + Configuration.CHUNK_VIEW_DISTANCE; int arrayZ = (position.z - worldViewPositionZ) + Configuration.CHUNK_VIEW_DISTANCE; Chunk newChunk = chunkPool.GetChunk(position); ChunkRepository.Add(newChunk); ChunkRepository.SetChunkAtPosition(position, newChunk); loadedChunksCheckArray[arrayX, position.y, arrayZ] = true; newChunk.LoadOrGenerate(); return(newChunk); }
// TODO -- Split up this function to make it shorter and more manageable public void CleanupOldChunks() { // TODO -- This is a weird place to update the worldviewposition worldViewPositionX = (int)(Camera.main.transform.position.x / Chunk.SIZE); worldViewPositionZ = (int)(Camera.main.transform.position.z / Chunk.SIZE); for (int xIttr = 0; xIttr < Configuration.CHUNK_VIEW_DISTANCE * 2 + 1; xIttr++) { for (int yIttr = 0; yIttr < chunkArrayHeight; yIttr++) { for (int zIttr = 0; zIttr < Configuration.CHUNK_VIEW_DISTANCE * 2 + 1; zIttr++) { loadedChunksCheckArray[xIttr, yIttr, zIttr] = false; } } } // Get rid of chunks that are too far from the camera for (int chunkIndex = 0; chunkIndex < ChunkRepository.NumberOfChunks(); chunkIndex++) { Chunk chunk = ChunkRepository.GetChunkAtIndex(chunkIndex); // If the chunk is out of range now, return it int xDiff = Mathf.Abs(chunk.WorldPosition().x - worldViewPositionX); int zDiff = Mathf.Abs(chunk.WorldPosition().z - worldViewPositionZ); if ((xDiff > Configuration.CHUNK_VIEW_DISTANCE) || (zDiff > Configuration.CHUNK_VIEW_DISTANCE)) { ChunkSpacePosition location = chunk.WorldPosition(); ChunkRepository.SetChunkAtPosition(location, null); ChunkRepository.Remove(chunk); chunk.MarkForUnload(); unloadChunksList.Add(chunk); } else { int markX = (chunk.WorldPosition().x - worldViewPositionX) + Configuration.CHUNK_VIEW_DISTANCE; int markZ = (chunk.WorldPosition().z - worldViewPositionZ) + Configuration.CHUNK_VIEW_DISTANCE; loadedChunksCheckArray[markX, chunk.WorldPosition().y, markZ] = true; } } }