gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:28:05 24 4
gpt4 key购买 nike

我想更改以下代码,以便我可以在此函数中传递类型为 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();
}

最佳答案

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com