В Unity создание пула для объектов типа `GameObject` немного отличается. Вам не нужен специальный интерфейс или абстрактный класс, потому что вы работаете непосредственно с экземплярами `GameObject`. Вот как вы можете это сделать:
1. **Класс GameObjectPool**:
```csharp
using UnityEngine;
using System.Collections.Generic;
public class GameObjectPool
{
private Dictionary<string, Queue<GameObject>> poolDictionary = new Dictionary<string, Queue<GameObject>>();
private Dictionary<string, GameObject> prefabDictionary = new Dictionary<string, GameObject>();
public void RegisterPrefab(GameObject prefab)
{
string key = prefab.name;
if (!prefabDictionary.ContainsKey(key))
{
prefabDictionary[key] = prefab;
poolDictionary[key] = new Queue<GameObject>();
}
}
public GameObject Get(string key)
{
if (poolDictionary.ContainsKey(key) && poolDictionary[key].Count > 0)
{
GameObject obj = poolDictionary[key].Dequeue();
obj.SetActive(true);
return obj;
}
else if (prefabDictionary.ContainsKey(key))
{
GameObject obj = Object.Instantiate(prefabDictionary[key]);
obj.name = key;
return obj;
}
return null;
}
public void Return(GameObject obj)
{
string key = obj.name;
if (poolDictionary.ContainsKey(key))
{
obj.SetActive(false);
poolDictionary[key].Enqueue(obj);
}
}
}
```
2. **Пример использования**:
Допустим, у вас есть некоторые префабы, которые вы хотите использовать в пуле. Вы можете зарегистрировать их в пуле и затем получать/возвращать экземпляры при необходимости.
```csharp
public class Example : MonoBehaviour
{
public GameObject enemyPrefab;
public GameObject bulletPrefab;
private GameObjectPool pool;
private void Start()
{
pool = new GameObjectPool();
pool.RegisterPrefab(enemyPrefab);
pool.RegisterPrefab(bulletPrefab);
}
private void SpawnEnemy()
{
GameObject enemy = pool.Get(enemyPrefab.name);
// Устанавливаем позицию, поведение и т.д.
}
private void ReturnEnemy(GameObject enemy)
{
pool.Return(enemy);
}
}
```
Этот подход обеспечивает высокую производительность, позволяя избежать частого создания и уничтожения игровых объектов в Unity. Вместо этого, объекты активируются и деактивируются по мере необходимости, что снижает нагрузку на сборщик мусора (garbage collector) и повышает общую производительность вашей игры.