找到所有具有基类组件的gameojects

时间:2018-02-22 11:55:19

标签: c# unity3d

我有从MonoBehaviour

派生的基类
public abstract class AbstractMyGameBeh : MonoBehaviour{//....}

还有很多其他类,实现了这个基类。

public class MyGameBeh: AbstractMyGameBeh {//....}
public class BMyGameBeh: AbstractMyGameBeh {//....}
public class CMyGameBeh: AbstractMyGameBeh {//....}

所以现在我需要找到这个类的所有游戏对象。 Ofcource,我可以这样做,但如果我从AbstractMyGameBeh派生更多的类,我将不得不再次修复这个代码部分。

GameObject.FindObjectsOfType<AMyGameBeh>()
GameObject.FindObjectsOfType<BMyGameBeh>()
GameObject.FindObjectsOfType<CMyGameBeh>()

2 个答案:

答案 0 :(得分:1)

C#6.0允许使用

typeof

if(objOfTypeMyGameBeh.GetType() == typeof(AbstractMyGameBeh))
{
 //It's the type you want
}
else
{
//it's not the type you want
}

as

 if(objOfTypeMyGameBeh as AbstractMyGameBeh != null)
    {
     //It's the type you want, works aswell with inheritance
    }
    else
    {
    //it's not the type you want
    }

这应该可行,你可以很容易地把它放在循环中来检查每个对象。

正如评论中所指出的,如果你没有存储你可以使用的值是关键字

答案 1 :(得分:0)

我最近遇到了类似问题,此解决方案可能适用于您的问题:

    public static IEnumerable<Type> GetTypes()
    {

        var sourceAssembly = Assembly.GetCallingAssembly();
        var assemblies = new List<Assembly>();
        assemblies.AddRange(sourceAssembly.GetReferencedAssemblies().Select(an => Assembly.Load(an)));
        assemblies.Add(sourceAssembly);

        var subclassTypes = new HashSet<Type>();
        foreach (var assembly in assemblies)
        {
            var types = assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(AbstractMyGameBeh)));
            foreach (var type in types) subclassTypes.Add(type);
        }
        return subclassTypes;
    }

即使您的AbstractMyGameBeh位于不同的程序集中,只要您从所有子类都可用的程序集中调用它,这应该可以正常工作。

它将搜索所有程序集(调用它们及其引用的所有程序集),用于抽象类的继承类。

现在,这将为您提供一组类型。所以你仍然需要使用反射来调用GameObject.FindObjectsOfType<T>()。应该是这样的......

foreach(var subclassType in subclassTypes)
{
     MethodInfo method = GetType("GameObject").GetMethod("FindObjectsOfType")
                                              .MakeGenericMethod(new Type[] { subclassType });
     method.Invoke(gameObject, new object[] { });
}