我正在统一设置GameObject池,但遇到错误。
我正在尝试将对象从Dictionary保存到新的gameObject。
请记住,我简化了帖子的代码。
public class Pool
{
public string tag;
public GameObject prefab;
public int maximumSize;
}
public List<Pool> pools;
public Dictionary<string, Queue<GameObject>> poolDictionary;
private void UpdatePool()
{
var objectPool = new Queue<GameObject>();
for (int i = 0; i < pool.maximumSize; i++)
{
GameObject obj = Instantiate(pool.prefab);
obj.SetActive(false);
objectPool.Enqueue(obj);
}
poolDictionary.Add(pool.tag, objectPool);
}
public void SpawnFromPool(string tag)
{
// the error is present here:
GameObject objectToSpawn = poolDictionary[tag];
}
如果我输入:
GameObject objectToSpawn = poolDictionary[tag].Dequeue();
它工作得很好,我可以出队和入队,但这不是我要使用的方法。非常感谢您的帮助。
错误类型: 无法将类型'System.Collections.Generic.Queue> UnityEngine.GameObject>隐式转换为'UnityEngine.GameObject'
答案 0 :(得分:1)
如上所述,问题是poolDictionary[tag]
的类型为Queue<GameObject>
,而不是GameObject
。
如果要在不使用Dequeue
的情况下检索该队列中的第一个元素(这会从队列中删除该元素),则可以简单地使用Peek
来代替
GameObject objectToSpawn = poolDictionary[tag].Peek();
此方法类似于出队方法,但是Peek不会修改队列。
要全部检索而不将其从队列中删除,您可以使用例如ToArray()
,并在for
或foreach
循环中遍历所有元素,或仅访问特定元素,例如对Peek
的相等调用(不考虑课程开销)
GameObject objectToSpawn = poolDictionary[tag].ToArray()[0];
我不明白的是为什么如果不想Queue
使用Dequeue
...
与List<GameObject>
的顺序也不会改变(至少在没有积极地进行操作的情况下)相比,您可能只使用List
即可
如果这是明确地用于对象池(似乎是从命名和生成而来的),则您可能应该注意Tutorial on Object Pooling ..破坏者:他们使用List
;)