我是unity新手,现在遇到一个关于Queue使用的问题。 生成并创建队列后,我只能取出对象。 当我尝试使用Enqueue()放回时,会出现NullReferenceException错误(在其他脚本中调用)。 以下是我的代码。希望得到帮助
public Queue<GameObject> enemyPool;
public static EnemyPoolM instance;
public int poolNum = 5;
private void Awake()
{
instance = this;
}
void Start()
{
enemyPool = new Queue<GameObject>();
GameObject enemy = null;
for (int i = 0; i < poolNum; i++)
{
enemy = Instantiate(enemy1_prefab);
enemy.SetActive(false);
enemyPool.Enqueue(enemy);
}
}
public GameObject GetEnemy()
{
if (enemyPool.Count>0)
{
GameObject enemy = enemyPool.Dequeue();
enemy.SetActive(true);
return enemy;
}
else
{
return Instantiate(enemy1_prefab);
}
}
public void RecoverEnemy(GameObject obj)
{
obj.SetActive(false);
enemyPool.Enqueue(obj); //这里就是unity报错的代码
}
下面是我在其他脚本中调用这个方法的代码
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
enemy = this.gameObject;
EnemyPoolM.instance.RecoverEnemy(enemy);
}
}
-----------------------------------------------------分割线--------------------------------------------------------------
通过在方法中间添加Debug.Log来进行问题判定
public void RecoverEnemy(GameObject obj)
{
if (obj == null)
{
Debug.Log("Object Null");
}
if (enemyPool == null)
{
Debug.Log("C-Queue is null");
}
obj.SetActive(false);
enemyPool.Enqueue(obj);
}
结果显示
C-Queue is null
这说明在这一步时数列为null不存在了,这让我很疑惑,我在最开始时就生成过数列了的中间只有取出的操作,怎么会不存在了呢。希望得到解答。
在大佬的帮助下问题成功的解决了。
方法就是将queue队列转换为static变量。
原因的话,大佬没回复,哈哈哈哈我的猜想是:
在定义变量时就将queue初始化,这样就不会在start()中进行才进行 ‘enemyPool = new Queue();’ 的操作,也或许是因为转为static后会一直储存在内存中不被清除也就不会为null了吧。
不知道对不对。希望有高人指点一下。
private static Queue<GameObject> enemyPool = new Queue<GameObject>();