Список Unity C# очищается после завершения метода — пул объектов

Я пытаюсь создать простой пул объектов в С# для Unity. До сих пор я использовал этот класс:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ObjectPool : MonoBehaviour
{

    public static ObjectPool ShareInstance;
    public List<GameObject> pooledObjects;
    public GameObject objectToPool;
    public int amountToPool;

    // Use this for initialization
    void Start()
    {
        pooledObjects = new List<GameObject>();

        for (int i = 0; i < amountToPool; i++)
        {
            GameObject obj = (GameObject)Instantiate(objectToPool);
            obj.SetActive(false);
            pooledObjects.Add(obj);
        }
    }

    void Awake()
    {
        ShareInstance = this;
    }

    public GameObject GetPooledObject()
    {
        for (int i = 0; i < pooledObjects.Count; i++)
        {
            if (!pooledObjects[i].activeInHierarchy)
            {
                return pooledObjects[i];
            }
        }
        return null;
    }
}

Метод запуска правильно делает неактивные экземпляры моего префаба. Однако я обнаружил ошибку, когда использую этот код для вызова GetPooledObject:

    GameObject optionTile = ObjecdtPooler.ShareInstance.GetPooledObject();
    if (optionTile != null)
    {
        optionTile.SetActive(true);
    }

Метод GetPooledObject считает, что список (pooledObjects) пуст. Это означает, что цикл for в этом методе просто пропускается и возвращается null. Я использовал debug.log, и список правильно заполнен экземплярами моего префаба. Однако, когда я вызываю метод GetPooledObject, список считается пустым.

Любые идеи?

Спасибо


person hinch    schedule 02.02.2018    source источник
comment
Запрошена ли optionTile в другом методе Start? Тогда вполне возможно, что запрос будет выполнен до вызова ObjectPool.Start().   -  person Lelefant    schedule 02.02.2018
comment
@Lelefant Нет, optionTile больше нигде не используется. Спасибо за предложение.   -  person hinch    schedule 02.02.2018
comment
Я имею в виду ваш второй фрагмент кода, когда он вызывается? После всех методов Start()? Порядок, в котором вызываются разные методы Start(), не определен. Если второй фрагмент находится в другом методе Start(), он может быть вызван до инициализации пула.   -  person Lelefant    schedule 02.02.2018
comment
Я думаю, что это он! Я не могу проверить это прямо сейчас, но я об этом не подумал. Спасибо.   -  person hinch    schedule 02.02.2018


Ответы (1)


Я ожидаю, что либо amountToPool имеет начальное значение 0, либо если оно больше 0, все объекты используются. Таким образом, вы должны расширить свой пул, чтобы он увеличивался на заданное значение, когда все объекты используются.

person user743414    schedule 02.02.2018
comment
Привет @ user743414 Извините, я забыл упомянуть об этом в своем описании, но я уже установил сумму для пула, и экземпляры создаются. Все экземпляры неактивны, что означает, что они должны быть выбраны. Однако это по-прежнему не объясняет, почему list.count равен 0. - person hinch; 02.02.2018
comment
@hinch Тогда единственным ответом может быть то, что используется не тот пул, который вы ожидаете. - person user743414; 02.02.2018