Unity3D: список возвращает ноль при доступе из другого класса

В настоящее время я пытаюсь сделать небольшую мобильную игру в unity3D, и, поскольку я всегда слышу, что использование instantiate / destroy - очень плохой путь (хотя я никогда не делал ничего достаточно большого, где это фактически стало проблемой), я решил попробовать и сделай у пула систему.

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

Операция недопустима из-за текущего состояния объекта System.Linq.Enumerable.First[GameObject] (источник IEnumerable`1)

Я не могу найти кого-то еще с этой проблемой. И решения, которые кажутся связанными, не работают. Основная проблема также может быть.. Почему это происходит?

Скрипт пула:

public class ObjectPool : MonoBehaviour {


    GameObject basicCell;
    GameObject basicFood;

    private Vector3 poolSpawnPos;

    [SerializeField]
    private int cellAmount;

    [SerializeField]
    private int foodAmount;

    List<GameObject> cellPool;
    List<GameObject> foodPool;

    GameObject foodManager;
    GameObject cellManager;
    // Use this for initialization
    void Awake () {

        foodManager = gameObject.transform.FindChild ("FoodPool").gameObject;
        cellManager = gameObject.transform.FindChild ("CellPool").gameObject;

        cellPool = new List<GameObject> (cellAmount);
        foodPool = new List<GameObject> (foodAmount);
        poolSpawnPos = new Vector3 (8000, 8000, 8000);
        basicFood = Resources.Load ("Food/BasicFood/BasicFood") as GameObject;
        basicCell = Resources.Load ("Cell/Cell") as GameObject;
        for (int i = 0; i < cellAmount; i++) {
            GameObject currentCell = Instantiate(basicCell, poolSpawnPos, Quaternion.identity) as GameObject;
            currentCell.transform.parent = cellManager.transform;
            currentCell.SetActive (false);
            cellPool.Add (currentCell);

        }

        for (int i = 0; i < foodAmount; i++){
            GameObject currentFood = Instantiate(basicFood, poolSpawnPos, Quaternion.identity) as GameObject;
            currentFood.transform.parent = foodManager.transform;
            currentFood.SetActive (false);
            foodPool.Add (currentFood);
        }
    }

    // Update is called once per frame
    void Update () {
        //if(foodPool.Count > 0)
        //  SpawnFood (new Vector3 (0, 0, 0));
    }

    public void SpawnFood(Vector3 spawnPosition)
    {
        GameObject selectedFood = null;
        selectedFood = foodPool.First();
        print (selectedFood);
        selectedFood.SetActive (true);
        foodPool.Remove (selectedFood);

        selectedFood.transform.parent = null;
        selectedFood.transform.position = spawnPosition;


        //set food Stats


    }


    public void KillFood(GameObject killedFood)
    {
        foodPool.Add (killedFood);
        killedFood.transform.position = poolSpawnPos;
        killedFood.transform.parent = foodManager.transform;
        killedFood.SetActive (false);

    }
}

Сценарий, из которого мне нужно вызвать метод:

public class FoodManager : MonoBehaviour {

    public ObjectPool pool;
    public int initialFoodNumber = 50;

    void Awake()
    {
        pool = GameObject.Find("ObjectPool").GetComponent<ObjectPool>();

        for (int i = 0; i <= initialFoodNumber; i++)
        {
            pool.SpawnFood(new Vector3(Random.Range(-40, 41), 0, Random.Range(-40, 41)));
        }
    }

}

1 ответ

Решение

Вы можете изменить Awake() в FoodManager в Start() чтобы гарантировать, что код в ObjectPool вызывается первым.

Или вы можете явно установить порядок выполнения скрипта для этих двух классов. Это делается путем перехода к Edit > Project Settings > Script Execution Order меню и добавление обоих скриптов, ObjectPool быть выше FoodManager, Источник

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