Реализация (повторное использование) пула объектов в игре Unity Runner

У меня есть моя первая игра раннер. Все отлично работает Итак, этот вопрос об оптимизации.

В моей игре 15 платформ (дорожные префабы, на которых бегает игрок). Случайно из 15 любой 1 создается, и это продолжает происходить. Когда игрок проходит несколько платформ, оставленные позади платформы разрушаются. Я составил список для отслеживания платформ и удаления из них последних сборных платформ ( list[0]). И новые создаются впереди.

По мере приближения игры она становится быстрой, что означает, что операция создания / уничтожения происходит сейчас чаще.

Я читал об объединении объектов. Я понял концепцию, и у меня очень сильное мнение, что я должен использовать это в своей игре. Я создаю пул объектов. Работает отлично. Теперь моя проблема -

ПРОБЛЕМА - Как я должен повторно использовать объект из моего созданного пула? В моей игре я придумал следующее: платформы, которые оставил пользователь, должны менять положение с места на место (направление, в котором движется пользователь). Как я могу этого достичь?

Я следовал этим учебникам - https://www.youtube.com/playlist?list=PLLH3mUGkfFCXps_IYvtPcE9vcvqmGMpRK

1 ответ

Решение

Когда игрок проходит несколько платформ, оставленные позади платформы разрушаются. Я составил список для отслеживания платформ и удаления из них последних сборных платформ ( list[0]). И новые создаются впереди.

Есть много способов сделать объект пула. Один из них включает добавление объектов в очередь и удаление их, когда они используются. Если вы хотите переработать / уничтожить их, добавьте их обратно в список.


Как мне повторно использовать объект из моего созданного пула?

Это действительно легко. Вместо того, чтобы делать это каждый раз:

Instantiate(prefab, postion, Quaternion.identity);

Сделайте это много раз, когда игра начинается в функции "Пуск", и сохраните ее в массиве / списке:

List<GameObject> pool = new List<GameObject>();

void Start()
{
    for (int i = 0; i < 50; i++)
    {
        GameObject tempObj = Instantiate(prefab, postion, Quaternion.identity) as GameObject;
        pool.Add(tempObj);
    }
}

Когда вам нужно создать экземпляр Object во время игры, просто получите один из List/Array:

//Check if object is available in pool
if (pool.Count > 0)
{
    //Object is. Return 1
    GameObject objFromPool = pool[0];
    //Enable the Object
    objFromPool.SetActive(true);
}
else
{
    //Object is NOT. Instantiate new one
    GameObject objFromPool = Instantiate(prefab, postion, Quaternion.identity) as GameObject;
    //Enable the Object
    objFromPool.SetActive(true);
}

Когда вы закончите с использованием объекта. Вместо того чтобы делать Destroy(objFromPool);сбросьте положение этого GameObject, возможно, отключите его, если хотите, затем добавьте его обратно в List:

//Reset Pos
objFromPool.transform.position = Vector3.zero;
//Disable?
objFromPool.SetActive(false);
//Return back to the array
pool.Add(objFromPool);

Наконец, лучший способ сделать это - создать экземпляр всех объектов в массиве или списке. Используйте целое число, которое вы увеличиваете. Целое число начинается с 0 и увеличивается, пока не достигнет list/array.Length-1, Затем вы можете использовать это целое число, чтобы получить объект из пула.

Вы можете увидеть пример этого метода, реализованного как ArrayObjectPooling вот и как это использовать.

Другие вопросы по тегам