Реализация (повторное использование) пула объектов в игре 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
вот и как это использовать.