Object Pool I
Clase 26 de 32 • Curso de Programación 2D con Unity: Intermedio
Resumen
¿Qué es el Object Pooler y por qué es importante?
El Object Pooler es un patrón de diseño que nos permite optimizar el rendimiento y uso de memoria en nuestro videojuego reutilizando objetos que ya han sido instanciados, en lugar de crear y destruir objetos constantemente. Esto es beneficioso porque al crear un objeto, se ocupa espacio en memoria, y si lo destruimos, ese espacio no se libera inmediatamente hasta que el Garbage Collector realiza su función. Por este motivo, el Object Pooler nos ayuda a gestionar mejor los recursos de memoria.
¿Cómo funciona el Object Pooler?
El Object Pooler utiliza una lista de objetos que están listos para ser reutilizados. Si se necesitan más objetos de los disponibles, se instancian nuevos y se agregan a la lista. Este enfoque es especialmente útil para juegos donde se generan muchas instancias repetitivas, como balas disparadas desde un arma o enemigos como aviones y barcos.
¿Cómo se implementa un Object Pooler?
Primero, tenemos que crear una nueva clase que servirá como contenedor de un GameObject
y una cantidad definida de objetos que se instanciarán inicialmente. Aquí hay unos pasos básicos para estructurar tu Object Pooler:
public class ObjectPoolItem {
public GameObject objectToPool;
public int amountToPool;
}
-
Definición de la clase: Creamos la clase
ObjectPoolItem
que tendrá unGameObject
para ser añadido a la lista de objetos y unint
que determinará la cantidad de instancias iniciales. -
Serialización del sistema: Usamos
System.Serializable
para que la clase sea visible y manipulable desde el editor de Unity. -
Implementación de un Singleton: Convertimos la clase en un Singleton para que pueda ser accedida desde múltiples scripts en la misma escena del juego.
-
Listas de objetos: Creamos dos listas:
- Una lista de
ObjectPoolItem
,itemsToPool
, que contiene los objetos a instanciar. - Una lista de
GameObjects
,instanceObjects
, que almacenará los objetos ya instanciados.
- Una lista de
public static ObjectPooler Instance;
public List<ObjectPoolItem> itemsToPool;
public List<GameObject> instanceObjects;
¿Cómo inicializar y gestionar los objetos?
Dentro del método Awake
, inicializamos el Singleton. En el método Start
, creamos las instancias y las añadimos a las listas:
void Awake() {
Instance = this;
}
void Start() {
instanceObjects = new List<GameObject>();
foreach (ObjectPoolItem item in itemsToPool) {
for (int i = 0; i < item.amountToPool; i++) {
GameObject obj = Instantiate(item.objectToPool);
obj.SetActive(false);
instanceObjects.Add(obj);
}
}
}
-
Inicialización del Singleton: En el método
Awake
, designamosInstance
como el objeto actual delObjectPooler
. -
Creación de instancias: En
Start
, iteramos sobreitemsToPool
, instanciando y desactivando cada objeto y luego los añadimos ainstanceObjects
.
Consejos prácticos para usar Object Pooler
- Asegúrate de que los objetos dentro de la pool estén desactivados cuando no están en uso para ahorrar recursos.
- Recuerda que el patrón Object Pooler es ideal para objetos que se instancian y destruyen con mucha frecuencia.
- Evalúa el tamaño inicial del pool según las necesidades de tu juego para optimizar rendimiento.
El Object Pooler es un poderoso aliado en la optimización de juegos, especialmente en aquellos con altos requerimientos de memoria y rendimiento, como los shooters. Este patrón te permitirá escalar tus proyectos eficientemente y ofrecer una mejor experiencia al jugador. ¡Sigue practicando y verás cómo mejoras tus habilidades de desarrollo!