【问题标题】:C# Generics / Unity3d - how to supply a GameObject constraint?C# Generics / Unity3d - 如何提供 GameObject 约束?
【发布时间】:2016-06-18 15:23:43
【问题描述】:

我刚刚学习使用 C# 泛型,Unity 给了我一个曲线球。我有这个方法,我打算向其中传递一个列表或一个数组并返回一个可变对象类型的项目(可能是 GameObject、ParticleSystem 等,具体取决于数组内容):

private T RetrieveItem<T>(IList<T> list) where T : Component
{

    for (int i = 0; i < list.Count; i++)
    {

        if (!list[i].GetComponent<GameObject>().activeInHierarchy)
        {
            return list[i];
        }
    }

    return list[0];
}

这编译得很好,但是当我尝试使用它时:

GameObject obj = RetrieveItem<GameObject>(myListOrArray);

我收到错误“类型‘UnityEngine.GameObject’不能用作泛型类型或方法‘J_ObjectPool.RetrieveItem(IList)’中的类型参数‘T’。‘UnityEngine.GameObject’没有隐式引用转换' 到 'UnityEngine.Component'。”

我尝试使用 Monobehaviour 作为约束并得到相同的错误(无法将 GameObject 转换为 Monobehaviour),我尝试使用 UnityEngine.Object 但得到相同的错误,此外我无法使用 GetComponent 方法.最后我尝试使用 GameObject 作为约束,但编译器抱怨“GameObject 不是有效的约束”。

有什么想法可以让它发挥作用吗?谢谢。

【问题讨论】:

    标签: c# generics unity3d


    【解决方案1】:

    虽然list[i].GetComponent&lt;GameObject&gt;() 可以编译,但在运行时没有意义。

    GetComponent&lt;T&gt;() 返回一个 T 类型的组件。GameObject 不是一个组件,所以GetComponent&lt;GameObject&gt;() 将始终返回 null。

    游戏对象和组件是两个完全独立的东西。游戏对象基本上是一个包含任意数量组件的容器。您可以像这样获取包含 Component 的 GameObject:

    Component component = ...;
    GameObject containingObject = component.gameObject;
    

    所以你的代码应该是这样的

    private T RetrieveItem<T>(IList<T> list) where T : Component
    {
        for (int i = 0; i < list.Count; i++)
        {
            if (!list[i].gameObject.activeInHierarchy)
            {
                return list[i];
            }
        }
        return list[0];
    }
    

    你可能会问,为什么GetComponent&lt;T&gt;() 不限制 T 成为一个组件。也就是让GetComponent也可以和Interface类型一起使用,当然不能从Component派生出来,而Components仍然可以实现。

    【讨论】:

    • 谢谢,我在摆姿势之前尝试过,但当我尝试使用它时仍然遇到同样的错误:GameObject obj = RetrieveItem(myListOrArray); T 将作为组件返回,但我的数组包含 GameObjects 或 ParticleSystems。似乎我需要在返回之前以某种方式将 T 转换为任一类型?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多