O Object Pool é um componente utilizado para melhorar o desempenho e a eficiência de jogos e aplicativos que fazem uso intensivo de criação e destruição de objetos. O objetivo do Object Pool é reutilizar objetos em vez de criar novas instâncias sempre que necessário, reduzindo assim o overhead de alocação de memória e otimizando o uso dos recursos do sistema.
O Object Pool implementado neste projeto possui as seguintes funcionalidades:
- Criação inicial de um pool de objetos com um tamanho pré-definido.
- Reutilização de objetos inativos em vez de criar novas instâncias.
- Ativação e desativação de objetos do pool conforme a necessidade.
- Gerenciamento de objetos ativos e inativos.
- Suporte a diferentes tipos de objetos.
- Possibilidade de personalizar o tamanho do pool e outras configurações.
Para usar o Object Pool em seu projeto, siga as etapas abaixo:
- Adicione o script
ObjectPool.cs
ao seu projeto Unity. - Crie uma classe para representar os objetos que serão gerenciados pelo pool, estendendo a classe
MonoBehaviour
. - No código da classe do objeto, adicione o campo
ObjectPool<T>
para referenciar o pool de objetos. - Implemente o método
Awake
da classe do objeto para inicializar o pool de objetos. - Utilize o método
GetObject()
para obter um objeto ativo do pool. Caso não haja objetos inativos disponíveis, o pool criará uma nova instância do objeto. - Utilize o método
ReturnObject(T obj)
para retornar um objeto ao pool quando ele não estiver mais em uso.
Exemplo de uso:
public class Bullet : MonoBehaviour
{
private ObjectPool<Bullet> bulletPool;
public void SetObjectPool(ObjectPool<Bullet> pool)
{
bulletPool = pool;
}
private void OnCollisionEnter(Collision collision)
{
// Lógica de colisão da bala
// Retorne a bala ao pool
bulletPool.ReturnObject(this);
}
}
public class BulletPoolManager : MonoBehaviour
{
public GameObject bulletPrefab;
public int poolSize = 20;
private ObjectPool<Bullet> bulletPool;
private void Awake()
{
bulletPool = new ObjectPool<Bullet>(bulletPrefab.GetComponent<Bullet>(), poolSize);
}
public Bullet GetBullet()
{
Bullet bullet = bulletPool.GetObject();
bullet.transform.position = transform.position;
bullet.gameObject.SetActive(true);
return bullet;
}
}
Contribuições são bem-vindas! Sinta-se à vontade para abrir problemas (issues) e enviar pull requests com melhorias, correções de bugs ou novas funcionalidades.
Este projeto está licenciado sob a Licença MIT. Consulte o arquivo LICENSE para obter mais informações.