c# - Unity3D : List returns null when accessed from other class

标签 c# list unity-game-engine pooling

我目前正在尝试在unity3D中制作一款小型手机游戏,而且我总是听说使用实例化/销毁是一种非常糟糕的方法(尽管我从未制作过足够大的东西,这实际上成为了一个问题)我决定尝试并制作池系统。

我创建了一个脚本来处理两个单独列表中的所有池对象。我可以通过从脚本本身调用该方法来成功地从池中生成一个对象,但问题是当我尝试从另一个脚本调用该方法时,它不起作用。通过我所做的不同尝试,我要么得到了空引用异常,要么得到了错误:

Operation is not valid due to the current state of the object System.Linq.Enumerable.First[GameObject] (IEnumerable`1 source)

我真的找不到其他人遇到这个问题。并且似乎相关的解决方案不起作用。主要问题也可能是..为什么会发生这种情况?

池脚本:

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)));
        }
    }

}

最佳答案

您可以将FoodManager中的Awake()更改为Start(),以确保ObjectPool<中的代码 首先被调用。

或者您可以显式设置这两个类的脚本执行顺序。这是通过转到 Edit > Project Settings > Script Execution Order 菜单并添加两个脚本来完成的,ObjectPool 的排名高于 FoodManagerSource

关于c# - Unity3D : List returns null when accessed from other class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35211024/

相关文章:

c# - 将项目添加到 List<T>/防御性编程

linux - 在 bash 中扩展 {..} 内的变量?

Python 循环遍历字典列表以查找属性

c++ - 在 C++ 中打印列表元素的组件

unity-game-engine - 在 Unity 中使用 API 创建购物车

c# - 将克罗地亚语日期字符串解析为 DateTime

c# - 鉴于此字符串(带有 '\n' ),我如何从所有返回中删除它?

c# - 如何使用 ASP.NET MVC4 登录?

php - 如何使用Unity处理php session ?

c# - 玩家偏好保存值很慢吗?