Implémentation du pooling d'objets dans Unity

Le pooling d'objets est un modèle de conception utilisé dans le développement de jeux pour gérer et réutiliser efficacement les objets de jeu. Dans Unity, l'instanciation et la destruction fréquentes d'objets peuvent entraîner des problèmes de performances en raison de l'allocation de mémoire et du garbage collection. Le pooling d'objets résout ce problème en pré-instanciant un nombre prédéfini d'objets au début du jeu, puis en les réutilisant selon les besoins, au lieu de les créer et de les détruire à la volée.

Ce didacticiel vous guidera dans l'implémentation du pool d'objets dans Unity à l'aide de C#. Nous allons créer un exemple simple avec des projectiles regroupés et réutilisés.

Étape 1: Mise en place du projet

  1. Créez un nouveau projet Unity ou ouvrez-en un existant.
  2. Créez un GameObject vide dans votre scène pour agir en tant que gestionnaire du pool d'objets.

Étape 2: écriture du script de regroupement d'objets

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

Étape 3: Création de l'objet à regrouper

Créez un préfabriqué pour l'objet que vous souhaitez regrouper. Pour cet exemple, créons un simple projectile.

  1. Créez un nouveau GameObject et nommez-le "Projectile".
  2. Attachez-y un composant Rigidbody pour permettre les interactions physiques.
  3. Vous pouvez éventuellement attacher un composant Collider pour détecter les collisions.
  4. Faites glisser le GameObject dans le dossier Assets pour créer un préfabriqué.

Étape 4: Utilisation du pooleur d'objets

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

Étape 5: Tester

  1. Attachez le script 'ProjectileSpawner' à n'importe quel GameObject de votre scène.
  2. Attribuez le préfabriqué Projectile au champ 'pooledObject' dans le composant 'ObjectPooler' du gestionnaire GameObject.
  3. Exécutez le jeu et appuyez sur le bouton de tir (en supposant "Fire1") pour générer des projectiles.

Conclusion

Le pooling d'objets est une technique d'optimisation essentielle dans le développement de jeux, notamment en Unity. En réutilisant les objets au lieu de les instancier et de les détruire à plusieurs reprises, vous pouvez améliorer les performances et l'efficacité de votre jeu. Dans ce didacticiel, vous avez appris à implémenter le pooling d'objets dans Unity avec un exemple simple utilisant C#.