【发布时间】:2015-04-10 04:52:38
【问题描述】:
我目前正在尝试优化获取 Unity 中包含特定组件的对象的函数的一部分。
当前代码如下所示
Collider[] collisions = Physics.OverlapSphere(point, range);
foreach (Collider item in collisions)
{
if (item.GetComponent<Rigidbody2D>())
{
rigidbodies.Add(item.GetComponent<Rigidbody2D>());
}
}
首先我得到一个包含碰撞器的对象列表,然后我运行一个 foreach 循环来获取还包含 Rigidbody2D 组件的对象
我正在尝试使用 LINQ 将其转换为一行代码。我正在尝试沿着这条线做一些事情
Collider[] collisions = Physics.OverlapSphere(point, range);
rigidbodies = (List<Rigidbody2D>)collisions.ToList().OfType<Rigidbody2D>().Where(x => x.GetComponent<Rigidbody2D>() == true);
不幸的是,这只会引发 InvalidCastException
【问题讨论】:
-
而且错误当然是正确的,您拥有的对象不是列表,而您试图假装它实际上是一个列表。您需要实际创建一个列表,而不是告诉编译器非列表对象实际上是一个列表。
-
我不认为您在这里进行了正确的优化,不能保证 linq 会更快,但是将
item.GetComponent<>()设置为变量将减少两次检索值的需要
标签: c# linq optimization unity3d