using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEngine.Tilemaps;
|
|
public class TilePool : MonoBehaviour
|
{
|
private Dictionary<Vector3Int, TileData> pooledTileData = new Dictionary<Vector3Int, TileData>();
|
private int poolSize = 10000; // Adjust pool size as needed
|
private Queue<TileData> availableTileData = new Queue<TileData>();
|
private HashSet<Vector3Int> activeTilePositions = new HashSet<Vector3Int>();
|
|
// Cache for rule tile data
|
private Dictionary<CustomRuleTile, TileBase[]> tileDataCache = new Dictionary<CustomRuleTile, TileBase[]>();
|
|
[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;
|
}
|
}
|