的唯一实体我知道,如果我有像Unity3d,得到具体的组件类型
Component tmp = (myClass)gameObject.GetComponent<myClass>();
可以返回空值,或者输入“MyClass的”的实例,如果它存在于我的具体游戏对象。现在,让我们假设我有一个来自给定半径的物理球体捕获的对象数组。我有20个游戏对象返回。
如何创建一个例程以仅返回具有组件的游戏对象,因此我不必一遍又一遍地编写自己的迭代器。再次是泛型,因为在一个领域我可能需要另一个地方。我不想为了使可读性变得很痛苦而全力投入类型转换。
反馈(每西普里安的答案)
我想你的方法逐字,并没有得到任何人的“类”,我想,即使它是一个附加组件。所以,我试着稍微修改一下例程。首先,确保一个合适的“游戏对象”。然后从那里,尝试拨打GameObject's .GetComponent<T>()
。但是这会导致错误,即使<T>
与我通过获取组件的类型相同。
public static IEnumerable<T> GetItemsAsT<T>(this object[] objects)
where T:class
{
GameObject gObj;
foreach(var obj in objects)
{
if(obj is GameObject)
{
gObj = (GameObject)obj;
if(gObj.GetComponent<T>() != null)
{
Debug.Log ("Found via IEnumerable");
yield return gObj.GetComponent<T>();
}
}
}
yield break;
}
每轻微修订的Ciprian的答案。
Error CS0311: The type 'T' cannot be used as type parameter 'T' in the generic type or method 'UnityEngine.GameObject.GetComponent<T>()'. There is no implicit reference conversion from 'T' to 'UnityEngine.Component'. (CS0311) (Assembly-CSharp)
感谢修改后的问题,稍后将在家中尝试,但认为这是因为我错过了“where T:class”子句 – DRapp 2014-09-24 13:19:48
我试过并更新了我的帖子和修改后的实现。你能看看它,看看它对你有意义吗? – DRapp 2014-09-24 21:09:09
经过反馈后更新了回复 – 2014-09-25 07:01:57