在Unity中将泛型用作变量类型

时间:2019-07-01 08:29:51

标签: c# unity3d generics

我希望更改以下代码,以便可以在此函数中传递类型为T或Component的参数,以便可以在类型实参中使用它。在下面的代码中将用它代替ButtonManager,这可能吗?我可以使用generics完成此操作吗?我希望这样做,以便可以将这种方法重新用于多种组件类型,而不必为每种组件类型都创建一个方法。

private GameObject[] FindInActiveObjectsByType()
    {
        List<GameObject> validTransforms = new List<GameObject>();
        ButtonManager[] objs = Resources.FindObjectsOfTypeAll<ButtonManager>() as ButtonManager[];
        for (int i = 0; i < objs.Length; i++)
        {
            if (objs[i].hideFlags == HideFlags.None)
            {
                objs[i].gameObject.GetComponent<ButtonManager>().ConfigureInteractives();
                validTransforms.Add(objs[i].gameObject);
            }
        }
        return validTransforms.ToArray();
    }

2 个答案:

答案 0 :(得分:2)

您已经在使用泛型重载Resources.FindObjectsOfTypeAll<T>(),该重载总是返回T[]

为了使其余部分(例如GetComponent)正常工作,您只需确保T始终为Component类型,就可以做到

public GameObject[] YourMethod<T>() where T : Component
{
    List<GameObject> validTransforms = new List<GameObject>();
    T[] objs = Resources.FindObjectsOfTypeAll<T>();
    for (int i = 0; i < objs.Length; i++)
    {
        if (objs[i].hideFlags == HideFlags.None)
        {
            //objs[i].gameObject.GetComponent<T>().ConfigureInteractives();
            validTransforms.Add(objs[i].gameObject);
        }
    }
    return validTransforms.ToArray();
}

请注意,但是ConfigureInteractives()似乎与您的ButtonManager具体相关,并且由于它不是Component的一部分而将引发异常。

因此,如果您需要从ButtonManager继承的其他内容,则只需将ComponentButtonManager交换

public void YourMethod<T>() where T : ButtonManager

  

如何检查传入的类型

有多种方法。您可以例如使用

检查确切的传递类型
if(typeof(T) == typeof(ButtonManager)) (objs[i].gameObject.GetComponent<T>() as ButtonManager).ConfigureInteractives();

但是您也可以简单地回到使用状态

if(typeof(T) == typeof(ButtonManager)) objs[i].gameObject.GetComponent<ButtonManager>().ConfigureInteractives();

或者您也可以使用typeof(T).IsSubclassOf(typeof(ButtonManager))来匹配继承的类型。

答案 1 :(得分:1)

当然,您可以执行以下操作:

public void YourFunction<T>() where T : Component
{
    T component = gameObject.GetComponent<T>();
}