Skip to content

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
    • Help
    • Support
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
FuryLion Courses. Unity
FuryLion Courses. Unity
  • Project overview
    • Project overview
    • Details
    • Activity
  • Analytics
    • Value Stream Analytics
  • Wiki
    • Wiki
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Public Documentation
  • FuryLion Courses. UnityFuryLion Courses. Unity
  • Wiki
  • пул объектов

пул объектов

Last edited by Alexander Nosick Mar 20, 2021
Page history
This is an old version of this page. You can view the most recent version or browse the history.

Пул объектов позволяет сократить время создания объектов благодаря повторному использованию уже существующих объектов вместо создания новых каждый раз.

Работа с пулом состоит из следующих этапов:

  1. Предсоздание необходимых на старте игры объектов
  2. Создание объекта
  3. Возвращение в пул
  4. Сброс состояния объекта

Пул реализуется 3-мя файлами:

  1. Интерфейс, который реализую все объекты, использующие пул:

    public interface IPoolable
    {
        void OnReturnToPool();
    }
  2. Файл, реализующий интерфейс IPoolable (Пример ниже)

public class SearchingWheelLooses : MonoBehaviour, IPoolable
{
    public SuperTextMesh textMesh;
    public voidSetText(string text)
    {
        textMesh.enabled = true;
        textMesh.Text = text;
    }

    public void OnReturnToPool()
    {
        textMesh.enabled = false;
    }
}
  1. Сам пул объектов
public class PoolObjects : MonoBehaviour
{
    public PoolObjectsInstance;
    public List<GameObject> prefabs = new List<GameObject>();
    public static readonly Dictionary<Type, Queue<MonoBehaviour>> pool = newDictionary<Type, Queue<MonoBehaviour>>();

    void Start()
    {
       Instance = this;
    }

    public static T Get<T>() whereT : MonoBehaviour, IPoolable
    {
        Type typeObject = typeof(T);

        if (pool.ContainsKey(typeObject))
        {
            if (pool[typeObject] != null && pool[typeObject].Count > 0)
            {
                IPoolable pO =  pool[typeObject].Dequeue() asT;
                return pO asT;
            }
            else
                return Create<T>();
        }
        else
        {
            return Create<T>();
        }
    }

    public static T Create<T>;() whereT : MonoBehaviour, IPoolable
    {
        foreach (var prefab inInstance.prefabs)
        {
            if (prefab == null)
            {
                Debug.LogError(&quot;Prefab is missing&quot;);
                continue;
            }

            var poolable = prefab.GetComponent<T>();

            if (poolable != null)
            {
                var poolableObject = Instantiate(prefab);
                poolableObject.transform.SetParent(Instance.transform, Vector3.zero);
                IPoolable pO =  poolableObject.GetComponent&lt;T&gt;();
                return pO as T;
            }
        }

        Debug.LogWarning(";Prefab list not exist " + typeof(T));

        return null;
    }

    public static void Release<T>(T poolableObject) whereT : MonoBehaviour, IPoolable
    {
        Type typeObject = poolableObject.GetType();

        poolableObject.transform.SetParent(Instance.transform, Vector3.zero, Vector3.one);

        if (pool.ContainsKey(typeObject))
        {
            if (!pool[typeObject].Contains(poolableObject))
                pool[typeObject].Enqueue(poolableObject);
        }
        else
        {
            pool.Add(typeObject, new Queue<MonoBehaviour>());
            pool[typeObject].Enqueue(poolableObject);
        }

        poolableObject.OnReturnToPool();

    }

    public static void Preload<T>(int count) whereT : MonoBehaviour, IPoolable
    {
        List<T>list = new List<T>(count);

        for (int i = 0; i < list.count; i++)
            list.Add(Get&lt;T&gt;(Instance.transform));

        for (int i = 0; i < list.count; i++)
            Release(list[i]);
    }
}

Задание

Модифицировать данный пул так чтобы:

  1. Добавить в методы, реализующие интерейс метод OnReturnFromPool()и вызывать его в момент возвращения элемента из пула.
  2. Внедрить пул в проект со звездолетом, изменив способ создания врагов с простого Instantiate на пул.
Clone repository
  • FuryLion UI System
  • Home
  • Project 3
  • SkyRoads
  • Unity Canvas Масштабируемый интерфейс
  • csharp interview task
  • match 3 with draw mechanic
  • project 4
  • zenject
  • Введение в язык программирования C#
  • Вращение камеры
  • Изучение основ скриптинга Unity
  • Подготовка к выполнению
  • Построение дома
  • Прогноз погоды
More Pages