using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; public class TilePool : MonoBehaviour { private Dictionary pooledTileData = new Dictionary(); private int poolSize = 10000; // Adjust pool size as needed private Queue availableTileData = new Queue(); private HashSet activeTilePositions = new HashSet(); // Cache for rule tile data private Dictionary tileDataCache = new Dictionary(); [System.Serializable] public class TileData { public Vector3Int position; public CustomRuleTile tileType; public bool isActive; } public void InitializePool(CustomRuleTile defaultTile) { pooledTileData.Clear(); availableTileData.Clear(); activeTilePositions.Clear(); // Pre-calculate tile data for the default tile if (!tileDataCache.ContainsKey(defaultTile)) { var tileData = new TileBase[9]; // Cache neighboring tile configurations tileDataCache[defaultTile] = tileData; } for (int i = 0; i < poolSize; i++) { availableTileData.Enqueue(new TileData { tileType = defaultTile, isActive = false }); } } public TileData GetTileData(Vector3Int position, CustomRuleTile tileType) { if (!activeTilePositions.Contains(position)) { if (availableTileData.Count > 0) { var tileData = availableTileData.Dequeue(); tileData.position = position; tileData.tileType = tileType; tileData.isActive = true; pooledTileData[position] = tileData; activeTilePositions.Add(position); return tileData; } } return pooledTileData.GetValueOrDefault(position); } public void ReturnTileData(Vector3Int position) { if (pooledTileData.TryGetValue(position, out TileData tileData)) { tileData.isActive = false; availableTileData.Enqueue(tileData); pooledTileData.Remove(position); } } public bool HasTileAt(Vector3Int position) { return pooledTileData.ContainsKey(position) && pooledTileData[position].isActive; } }