private TerrainChunk CreateNewChunk(Vector3Int mapPosition) { GameObject go = Instantiate(ChunkPrefab); go.hideFlags = HideFlags.DontSave; TerrainChunk chunk = go.GetComponent <TerrainChunk>(); chunk.transform.parent = Generator.Output; chunk.Provider = this; go.name = "Disabled"; go.SetActive(false); return(chunk); }
private TerrainChunk CreateChunk(Vector3Int mapPosition) { if (freeChunkQueue.Count > 0) { var chunk = freeChunkQueue.Dequeue(); chunk.Setup(mapPosition); chunks.Add(mapPosition, chunk); return(chunk); } else { TerrainChunk chunk = CreateNewChunk(mapPosition); chunks.Add(mapPosition, chunk); return(chunk); } }
private void Update() { Vector3Int caddyPosition = GetCameraChunkPosition(); if (!chunks.ContainsKey(caddyPosition)) { chunkQueue.Enqueue(caddyPosition); } Vector3Int top = caddyPosition, bottom = caddyPosition, left = caddyPosition, right = caddyPosition, topLeft = caddyPosition, topRight = caddyPosition, bottomLeft = caddyPosition, bottomRight = caddyPosition; top.y += 1; bottom.y -= 1; left.x -= 1; right.x += 1; topLeft.x -= 1; topLeft.y += 1; topRight.x += 1; topRight.y += 1; bottomLeft.x -= 1; bottomLeft.y -= 1; bottomRight.x += 1; bottomRight.y -= 1; if (!chunks.ContainsKey(top)) { chunkQueue.Enqueue(top); } if (!chunks.ContainsKey(bottom)) { chunkQueue.Enqueue(bottom); } if (!chunks.ContainsKey(left)) { chunkQueue.Enqueue(left); } if (!chunks.ContainsKey(right)) { chunkQueue.Enqueue(right); } if (!chunks.ContainsKey(topLeft)) { chunkQueue.Enqueue(topLeft); } if (!chunks.ContainsKey(topRight)) { chunkQueue.Enqueue(topRight); } if (!chunks.ContainsKey(bottomLeft)) { chunkQueue.Enqueue(bottomLeft); } if (!chunks.ContainsKey(bottomRight)) { chunkQueue.Enqueue(bottomRight); } while (chunkQueue.Count > 0) { CreateChunk(chunkQueue.Dequeue()); } while (chunks.Count > Generator.ActiveTilemaps) { float farthest = float.MinValue; TerrainChunk farthestChunk = null; Vector3Int key = Vector3Int.zero; foreach (var chunkKV in chunks) { float dist; if ((dist = Vector3Int.Distance(caddyPosition, chunkKV.Key)) > farthest) { farthestChunk = chunkKV.Value; farthest = dist; key = chunkKV.Key; } } if (farthestChunk != null) { farthestChunk.Disable(); freeChunkQueue.Enqueue(farthestChunk); chunks.Remove(key); } } }