Implementering af objektpooling i Unity

Objektpooling er et designmønster, der bruges i spiludvikling til effektivt at administrere og genbruge spilobjekter. I Unity kan instansiering og ødelæggelse af objekter ofte føre til ydeevneproblemer på grund af hukommelsesallokering og skraldindsamling. Objektpooling løser dette ved at præ-instantiere et foruddefineret antal objekter i starten af ​​spillet og derefter genbruge dem efter behov, i stedet for at skabe og ødelægge dem i farten.

Denne vejledning vil guide dig gennem implementering af objektpooling i Unity ved hjælp af C#. Vi laver et simpelt eksempel med projektiler, der samles og genbruges.

Trin 1: Opsætning af projektet

  1. Opret et nyt Unity-projekt eller åbn et eksisterende.
  2. Opret et tomt GameObject i din scene for at fungere som administrator for objektpuljen.

Trin 2: Skrivning af objektpoolingsscriptet

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

Trin 3: Oprettelse af objektet til pool

Opret en præfabrikation til det objekt, du vil samle. For dette eksempel, lad os skabe et simpelt projektil.

  1. Opret et nyt GameObject og navngiv det "Projectile".
  2. Vedhæft en Rigidbody-komponent til den for at tillade fysikinteraktioner.
  3. Vedhæft eventuelt en Collider-komponent for at registrere kollisioner.
  4. Træk GameObject til mappen Assets for at oprette en prefab.

Trin 4: Brug af 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);
        }
    }
}

Trin 5: Test

  1. Vedhæft'ProjectileSpawner' scriptet til ethvert GameObject i din scene.
  2. Tildel projektilpræfabrikatet til 'pooledObject'-feltet i 'ObjectPooler'-komponenten i manager GameObject.
  3. Kør spillet og tryk på affyringsknappen (forudsat "Fire1") for at skabe projektiler.

Konklusion

Objektpooling er en vigtig optimeringsteknik i spiludvikling, især i Unity. Ved at genbruge objekter i stedet for at instantiere og ødelægge dem gentagne gange, kan du forbedre ydeevnen og effektiviteten af ​​dit spil. I denne tutorial har du lært, hvordan du implementerer objektpooling i Unity med et simpelt eksempel ved hjælp af C#.