使用另一个方法调用列出 RemoveAll

List RemoveAll with another method call

因此,我尝试遍历列表并从列表中删除项目并销毁游戏对象,所以起初我这样做了:

Pooler.Remove()

protected static void Remove(GameObject obj){
    PoolerItem p = (
        from item in pool
        where obj == item.gameObject
        select item
    ).FirstOrDefault();

    pool.Remove(p);
    GameObject.Destroy(p.gameObject);
}

遍历列表

foreach(PoolerItem p in pool.Where(x => x.poolName == "cube")){
    if(totalItems > minPoolSize && p.inactiveLifeSpan > 0 && !p.gameObject.activeSelf && Time.time - p.disableTime >= p.inactiveLifeSpan){
        Pooler.Remove(p);
    }
}

我收到一条错误消息,基本上是 您可以从循环访问的列表中删除项目

好的,有道理。所以我环顾四周,发现我应该使用 RemoveAll 所以我为此创建了代码并将其替换为我的 foreach,如下所示:

pool.RemoveAll(
    p => p.poolName == entry.poolGroupName 
    && p.inactiveLifeSpan > 0 
    && !p.gameObject.activeSelf 
    && Time.time - p.disableTime >= p.inactiveLifeSpan
);

唯一缺少的是 Pooler.Remove 中的这一行 GameObject.Destroy(p.gameObject);。我怎样才能用 pool.RemoveAll() 实现它?

你可以使用语句 lambda 而不是表达式,你可以在其中做任何你想做的事:

pool.RemoveAll(
p => { 
        if(p.poolName == entry.poolGroupName && 
           p.inactiveLifeSpan > 0 && 
           !p.gameObject.activeSelf  &&
           Time.time - p.disableTime >= p.inactiveLifeSpan)
        {
            GameObject.Destroy(p.gameObject);
            return true;
        }

        return false;
     });