Implementering av objektpooling i Unity

Objektpooling er et designmønster som brukes i spillutvikling for å effektivt administrere og gjenbruke spillobjekter. I Unity kan instansiering og ødeleggelse av objekter ofte føre til ytelsesproblemer på grunn av minnetildeling og søppelinnsamling. Objektpooling løser dette ved å forhåndsinstansiere et forhåndsdefinert antall objekter ved starten av spillet og deretter gjenbruke dem etter behov, i stedet for å lage og ødelegge dem på et øyeblikk.

Denne opplæringen vil veilede deg gjennom implementering av objektpooling i Unity ved å bruke C#. Vi skal lage et enkelt eksempel med prosjektiler som samles og gjenbrukes.

Trinn 1: Sette opp prosjektet

  1. Opprett et nytt Unity-prosjekt eller åpne et eksisterende.
  2. Lag et tomt GameObject i scenen din for å fungere som administrator for objektpoolen.

Trinn 2: Skrive objektpoolingsskriptet

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

Trinn 3: Opprette objektet til pool

Lag en prefab for objektet du ønsker å samle. For dette eksemplet, la oss lage et enkelt prosjektil.

  1. Opprett et nytt GameObject og navngi det "Projectile".
  2. Fest en Rigidbody-komponent til den for å tillate fysikkinteraksjoner.
  3. Eventuelt kan du koble til en Collider-komponent for å oppdage kollisjoner.
  4. Dra GameObject inn i Assets-mappen for å lage en prefab.

Trinn 4: Bruke 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);
        }
    }
}

Trinn 5: Test

  1. Fest skriptet 'ProjectileSpawner' til et hvilket som helst GameObject i scenen din.
  2. Tilordne Projectile prefab til 'pooledObject'-feltet i 'ObjectPooler'-komponenten til manager GameObject.
  3. Kjør spillet og trykk på avfyringsknappen (forutsatt "Fire1") for å skape prosjektiler.

Konklusjon

Objektpooling er en viktig optimaliseringsteknikk i spillutvikling, spesielt i Unity. Ved å gjenbruke gjenstander i stedet for å instansiere og ødelegge dem gjentatte ganger, kan du forbedre ytelsen og effektiviteten til spillet ditt. I denne opplæringen har du lært hvordan du implementerer objektpooling i Unity med et enkelt eksempel ved å bruke C#.