所以,我试图遍历一个列表并从列表中删除项目并销毁GameObject,所以起初我这样做了:
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
);
唯一缺少的是来自GameObject.Destroy(p.gameObject);
的这一行Pooler.Remove
。如何使用pool.RemoveAll()
实现该功能?
答案 0 :(得分:3)
您可以使用语句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;
});