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);
                }
            }
        }