c# - 在 Unity 中使用泛型作为变量类型

标签 c# unity-game-engine generics

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

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();
    }

最佳答案

您已经在使用通用重载 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

How could I check the passed in Type

有多种方法。你可以例如使用检查确切的传递类型

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)) 还可以匹配继承的类型。

关于c# - 在 Unity 中使用泛型作为变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56832338/

相关文章:

c# - Caliburn 微 : Disable button on form validation error

c# - Vector3 的纬度和经度未在 3D 球体上对齐

unity-game-engine - 从给定点和角度查找矢量幅度的最便宜方法

unity-game-engine - Unity3D 粒子系统粒子不跟随旋转

java - 强制子类仅绑定(bind)到该子类的枚举

c# - 尝试首先使用 EF 核心代码时出现 DbUpdateException 错误

c# - 其中一个主键值的类型与实体中定义的类型不匹配。有关详细信息,请参见内部异常

c# - 如何动态组合 linq 查询?

java - 如何在 Eclipse 中激活泛型类型警告?

swift - 将非泛型扩展为泛型