Реалізація об’єктного пулу в Unity

Об’єднання об’єктів — це шаблон проектування, який використовується в розробці ігор для ефективного керування та повторного використання об’єктів гри. У Unity часте створення та знищення об’єктів може призвести до проблем із продуктивністю через розподіл пам’яті та збирання сміття. Об’єднання об’єктів вирішує цю проблему шляхом створення попередньо визначеної кількості об’єктів на початку гри, а потім повторного їх використання за потреби замість створення та знищення на льоту.

Цей підручник допоможе вам реалізувати об’єктний пул у Unity за допомогою C#. Ми створимо простий приклад зі снарядами, які об’єднуються та повторно використовуються.

Крок 1: Налаштування проекту

  1. Створіть новий проект Unity або відкрийте існуючий.
  2. Створіть порожній GameObject у своїй сцені, щоб діяти як менеджер для пулу об’єктів.

Крок 2: Написання сценарію пулу об’єктів

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

Крок 3: Створення об’єкта для пулу

Створіть префаб для об’єкта, який потрібно об’єднати. Для цього прикладу давайте створимо простий снаряд.

  1. Створіть новий GameObject і назвіть його "Projectile".
  2. Приєднайте до нього компонент Rigidbody, щоб уможливити фізичну взаємодію.
  3. За бажанням можна приєднати компонент Collider для виявлення зіткнень.
  4. Перетягніть GameObject у папку Assets, щоб створити префаб.

Крок 4. Використання об’єктного пулера

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

Крок 5: Тест

  1. Прикріпіть сценарій 'ProjectileSpawner' до будь-якого GameObject у вашій сцені.
  2. Призначте префаб Projectile до поля 'pooledObject' у компоненті 'ObjectPooler' менеджера GameObject.
  3. Запустіть гру та натисніть кнопку вогню (якщо "Fire1"), щоб створити снаряди.

Висновок

Об’єднання об’єктів є важливою технікою оптимізації в розробці ігор, особливо в Unity. Повторно використовуючи об’єкти замість створення екземплярів і повторного їх знищення, ви можете підвищити продуктивність і ефективність вашої гри. У цьому підручнику ви дізналися, як реалізувати пул об’єктів у Unity на простому прикладі за допомогою C#.