无法将***类型隐式转换为****

时间:2019-01-01 11:45:43

标签: c# dictionary unity3d

我正在统一设置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'

1 个答案:

答案 0 :(得分:1)

如上所述,问题是poolDictionary[tag]的类型为Queue<GameObject>,而不是GameObject

如果要在不使用Dequeue的情况下检索该队列中的第一个元素(这会从队列中删除该元素),则可以简单地使用Peek来代替

GameObject objectToSpawn = poolDictionary[tag].Peek();
  

此方法类似于出队方法,但是Peek不会修改队列。


要全部检索而不将其从队列中删除,您可以使用例如ToArray(),并在forforeach循环中遍历所有元素,或仅访问特定元素,例如对Peek的相等调用(不考虑课程开销)

GameObject objectToSpawn = poolDictionary[tag].ToArray()[0];

我不明白的是为什么如果不想Queue使用Dequeue ...

List<GameObject>的顺序也不会改变(至少在没有积极地进行操作的情况下)相比,您可能只使用List即可

如果这是明确地用于对象池(似乎是从命名和生成而来的),则您可能应该注意Tutorial on Object Pooling ..破坏者:他们使用List;)