Implementando pool de objetos no Unity

Pool de objetos é um padrão de design usado no desenvolvimento de jogos para gerenciar e reutilizar objetos de jogos com eficiência. Em Unity, instanciar e destruir objetos com frequência pode levar a problemas de desempenho devido à alocação de memória e coleta de lixo. O pool de objetos resolve isso pré-instanciando um número predefinido de objetos no início do jogo e depois reutilizando-os conforme necessário, em vez de criá-los e destruí-los instantaneamente.

Este tutorial irá guiá-lo na implementação do pool de objetos em Unity usando C#. Criaremos um exemplo simples com projéteis que são agrupados e reutilizados.

Etapa 1: Configurando o Projeto

  1. Crie um novo projeto Unity ou abra um existente.
  2. Crie um GameObject vazio em sua cena para atuar como gerenciador do pool de objetos.

Etapa 2: Escrevendo o script de pool de objetos

using System.Collections.Generic;
using UnityEngine;

public class ObjectPooler : MonoBehaviour
{
    public static ObjectPooler Instance;

    public GameObject pooledObject;
    public int pooledAmount = 20;
    List pooledObjects;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        pooledObjects = new List();
        for (int i = 0; i < pooledAmount; i++)
        {
            GameObject obj = Instantiate(pooledObject);
            obj.SetActive(false);
            pooledObjects.Add(obj);
        }
    }

    public GameObject GetPooledObject()
    {
        for (int i = 0; i < pooledObjects.Count; i++)
        {
            if (!pooledObjects[i].activeInHierarchy)
            {
                return pooledObjects[i];
            }
        }

        return null;
    }
}

Etapa 3: Criando o Objeto para Pool

Crie um pré-fabricado para o objeto que você deseja agrupar. Para este exemplo, vamos criar um projétil simples.

  1. Crie um novo GameObject e nomeie-o "Projectile".
  2. Anexe um componente Rigidbody a ele para permitir interações físicas.
  3. Opcionalmente, anexe um componente Collider para detectar colisões.
  4. Arraste o GameObject para a pasta Assets para criar um pré-fabricado.

Etapa 4: usando o pool de objetos

using UnityEngine;

public class ProjectileSpawner : MonoBehaviour
{
    public float fireRate = 0.5f;
    float nextFire = 0.0f;

    void Update()
    {
        if (Input.GetButtonDown("Fire1") && Time.time > nextFire)
        {
            nextFire = Time.time + fireRate;
            SpawnProjectile();
        }
    }

    void SpawnProjectile()
    {
        GameObject projectile = ObjectPooler.Instance.GetPooledObject();

        if (projectile != null)
        {
            projectile.transform.position = transform.position;
            projectile.transform.rotation = transform.rotation;
            projectile.SetActive(true);
        }
    }
}

Etapa 5: teste

  1. Anexe o script 'ProjectileSpawner' a qualquer GameObject em sua cena.
  2. Atribua o projétil pré-fabricado ao campo 'pooledObject' no componente 'ObjectPooler' do gerenciador GameObject.
  3. Execute o jogo e pressione o botão de disparo (assumindo "Fire1") para gerar projéteis.

Conclusão

O pool de objetos é uma técnica de otimização essencial no desenvolvimento de jogos, especialmente em Unity. Ao reutilizar objetos em vez de instancia-los e destruí-los repetidamente, você pode melhorar o desempenho e a eficiência do seu jogo. Neste tutorial, você aprendeu como implementar o pool de objetos em Unity com um exemplo simples usando C#.

Artigos sugeridos
Implementando Teletransporte no Unity
Interagindo com objetos no jogo Unity
Script para capturar objetos no Unity
Criando um GrabPack no Unity inspirado em Poppy Playtime
Criando um efeito bullet time no Unity
Criando objetos interativos no Unity
Implementando interações cinéticas no Unity