Objectpooling in eenheid implementeren

Objectpooling is een ontwerppatroon dat wordt gebruikt bij de ontwikkeling van games om game-objecten efficiënt te beheren en opnieuw te gebruiken. In Unity kan het veelvuldig instantiëren en vernietigen van objecten leiden tot prestatieproblemen als gevolg van geheugentoewijzing en garbagecollection. Objectpooling pakt dit aan door aan het begin van het spel een vooraf bepaald aantal objecten vooraf te instantiëren en ze vervolgens indien nodig te hergebruiken, in plaats van ze in een mum van tijd te creëren en te vernietigen.

Deze tutorial begeleidt u bij het implementeren van objectpooling in Unity met behulp van C#. We zullen een eenvoudig voorbeeld maken met projectielen die worden samengevoegd en hergebruikt.

Stap 1: Het project opzetten

  1. Maak een nieuw Unity-project of open een bestaand project.
  2. Maak een leeg GameObject in uw scène om als manager voor de objectpool te fungeren.

Stap 2: Het objectpoolingscript schrijven

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

Stap 3: Het object maken om te poolen

Maak een prefab voor het object dat u wilt poolen. Laten we voor dit voorbeeld een eenvoudig projectiel maken.

  1. Maak een nieuw GameObject en noem het "Projectile".
  2. Bevestig een Rigidbody-component eraan om fysische interacties mogelijk te maken.
  3. Voeg optioneel een Collider-component toe om botsingen te detecteren.
  4. Sleep het GameObject naar de map Assets om een ​​prefab te maken.

Stap 4: De Object Pooler gebruiken

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

Stap 5: Testen

  1. Voeg het 'ProjectileSpawner'-script toe aan een GameObject in uw scène.
  2. Wijs het projectiel prefab toe aan het veld 'pooledObject' in de component 'ObjectPooler' van het Manager GameObject.
  3. Start het spel en druk op de vuurknop (ervan uitgaande dat "Fire1") om projectielen te spawnen.

Conclusie

Objectpooling is een essentiële optimalisatietechniek bij de ontwikkeling van games, vooral in Unity. Door objecten opnieuw te gebruiken in plaats van ze herhaaldelijk te instantiëren en te vernietigen, kun je de prestaties en efficiëntie van je spel verbeteren. In deze zelfstudie hebt u aan de hand van een eenvoudig voorbeeld met C# geleerd hoe u objectpooling in Unity implementeert.

Voorgestelde artikelen
Een Bullet Time-effect creëren in eenheid
Kinetische interacties in eenheid implementeren
Een jachtsimulator maken in Unity
Camerabewegingseffect creëren in eenheid
Teleportatie implementeren in Unity
Rotatie ter plaatse in eenheid
Een Bazooka in eenheid creëren