Unity:GetComponent <BaseClass <T >>-有什么解决方法吗?

Cer*_*rzi 5 unity-game-engine

如果对象的某个组件具有基类BaseClass<T>,则调用GetComponent<BaseClass<T>>()不会返回该组件。泛型参数似乎将其抛弃了,因为在BaseClass不使用泛型的情况下,GetComponent<BaseClass>()调用时将正确地将派生类作为组件返回。

有谁知道可靠的解决方法?在此类中使用泛型arg有点重要,因此显然我不愿为了适应这种情况而重写程序的类结构。

这是有关课程的粗略草图

//the base class that I'd like to be able to fetch the subclasses of using GetComponent
public abstract class BaseUIClass<T> : MonoBehaviour where T :BaseEntity {}

//EntityType1&2 are derived from BaseEntity
public class DerivedUIClass1 : BaseUIClass<EntityType1> {}
public class DerivedUIClass2 : BaseUIClass<EntityType2> {}
Run Code Online (Sandbox Code Playgroud)

BaseUIClass具有此方法:

public virtual void Setup(T entity) {}
Run Code Online (Sandbox Code Playgroud)

将组件添加到GO后不久需要调用该方法。

编辑:

实际上,我想要做的是以下操作,而无需进行硬编码(我想实际使用我定义的通用args)

if(uiClassObj is typeof(DerivedUIClass1) go.GetComponent<BaseUIClass<EntityType1>>();

else if(uiClassObj is typeof(DerivedUIClass2) go.GetComponent<BaseUIClass<EntityType2>>();
//etc
Run Code Online (Sandbox Code Playgroud)

但是考虑到正在使用类型的组件BaseUIClass<BaseEntity>,并且我感兴趣的两个以上派生类由DerivedUIClass1<EntityType1>和定义DerivedUIClass2<EntityType2>,转换肯定应该是隐式的吗?

Gal*_*dil 5

你不能按照你想要的方式做你想做的事,因为Unity不接受通用类的组件。

IE,如果你有:

public class MyGenericClass<T> : MonoBehaviour {}
Run Code Online (Sandbox Code Playgroud)

T除非您通过继承它的子类指定,否则您将无法将其添加为组件:

public class MySpecifiedClass : MyGenericClass<[specificType]> {}
Run Code Online (Sandbox Code Playgroud)

因此,为了解决您的问题,您应该简单地为基类作为组件添加时应该完成的所有操作实现一个特定的接口。我将向您展示一个带有float派生int类型的示例,您可以轻松扩展为您需要的任何类型。

基类

public class MyGenericClass<T> : MonoBehaviour {}
Run Code Online (Sandbox Code Playgroud)

您的组件类

public class MySpecifiedClass : MyGenericClass<[specificType]> {}
Run Code Online (Sandbox Code Playgroud)

获取接口并调用Setup()的代码

using UnityEngine;

public interface ISetup {
    void CallSetup();
}

public class BaseClass<T> : MonoBehaviour, ISetup {
    public T myEntity;

    public void CallSetup() {
        Setup(myEntity);
    }

    private void Setup(T entity) {
        Debug.Log(entity);
        //Your setup code
    }
}
Run Code Online (Sandbox Code Playgroud)