Implementera objektpoolning i Unity

Objektpoolning är ett designmönster som används i spelutveckling för att effektivt hantera och återanvända spelobjekt. I Unity kan instansiera och förstöra objekt ofta leda till prestandaproblem på grund av minnesallokering och sophämtning. Objektpooling åtgärdar detta genom att förinstantiera ett fördefinierat antal objekt i början av spelet och sedan återanvända dem vid behov, istället för att skapa och förstöra dem i farten.

Denna handledning guidar dig genom att implementera objektpoolning i Unity med C#. Vi kommer att skapa ett enkelt exempel med projektiler som slås samman och återanvänds.

Steg 1: Konfigurera projektet

  1. Skapa ett nytt Unity-projekt eller öppna ett befintligt.
  2. Skapa ett tomt GameObject i din scen för att agera som manager för objektpoolen.

Steg 2: Skriva objektpoolningsskriptet

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;
    }
}

Steg 3: Skapa objektet att poola

Skapa en prefab för objektet du vill slå samman. För det här exemplet, låt oss skapa en enkel projektil.

  1. Skapa ett nytt GameObject och namnge det "Projectile".
  2. Fäst en Rigidbody-komponent till den för att möjliggöra fysikinteraktioner.
  3. Eventuellt kan du ansluta en Collider-komponent för att upptäcka kollisioner.
  4. Dra GameObject till mappen Assets för att skapa en prefab.

Steg 4: Använda Object Pooler

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);
        }
    }
}

Steg 5: Testa

  1. Bifoga skriptet 'ProjectileSpawner' till valfritt GameObject i din scen.
  2. Tilldela Projectile prefab till 'pooledObject'-fältet i 'ObjectPooler'-komponenten i manager GameObject.
  3. Kör spelet och tryck på avfyrningsknappen (förutsatt "Fire1") för att skapa projektiler.

Slutsats

Objektpoolning är en viktig optimeringsteknik i spelutveckling, särskilt i Unity. Genom att återanvända objekt istället för att instansiera och förstöra dem upprepade gånger kan du förbättra ditt spels prestanda och effektivitet. I den här handledningen har du lärt dig hur du implementerar objektpoolning i Unity med ett enkelt exempel med C#.