Unity3D C#抽象类,静态实例创建无法正常工作

时间:2016-10-13 07:10:37

标签: c# generics unity3d types

你好我正在研究一个对象池,有T" ObjectPooling"。 并做了一个孩子班。所以我想为这个类制作自动单例。所以如果我使用" instance"它应检查m_instance是否为null。如果是,那么#34;产生"脚本并分配m_instance。

public abstract class ObjectPooling<T> : MonoBehaviour
{

    public static float start = 30;
    public static bool extendable = true;

    public List<T> objects = new List<T>();

    public abstract T getNext();
    public abstract void Add(T obj);

    static T m_instance;
    public static T instance
    {
        get
        {
            return m_instance ?? (m_instance = CreateInstance());
        }
    }

    protected static T CreateInstance()
    {

        GameObject g = new GameObject("ObjectPooling");
        var c = g.AddComponent<T>();
        return c;
    }
}

问题出在CreateInstance()的最后几行。 它说

  

无法初始化隐式类型的局部变量声明   使用`UnityEngine.GameObject.AddComponent(System.Type)&#39;

我不知道我现在能在这做什么。我以前尝试过使用ObjectPooling,但那没有错误但也没有用。

所以我的目标是孩子也有单身人士。我当前手动完成它但希望我以后应该像这样(ofc基类应该做而不是子类但仍然检查它。)

public class BulletPooling : ObjectPooling<BulletBase>  
{
    public override void Add(BulletBase obj)
    {
        if(extendable)
            objects.Add(obj);
    }

    public override BulletBase getNext()
    {

        for(int i = 0; i < objects.Count; i++)
        {
            var bs = objects[i];
            if (!bs.gameObject.activeInHierarchy)
                return bs;
        }


        return null;
    }

    // this part
    static BulletPooling m_instance;
    public static BulletPooling instance
    {
        get
        {
            return m_instance ?? (m_instance = CreateInstance());
        }
    }

    protected static BulletPooling CreateInstance()
    {

        GameObject g = new GameObject("ObjectPooling");
        var c = g.AddComponent<BulletPooling>();
        return c;
    }
}

你可以在这里看到我正在使用新的Childclass,它有T = BulletBase

1 个答案:

答案 0 :(得分:1)

这是因为GameObject.AddComponent需要特定类型的对象,而不是&#34;任何类型&#34;。在ObjectPooling类中,您只指定它可以是任何类型的对象,并且编译器无法预先确定您正在使用哪些类型。

AddComponent是一种讨厌的函数,因为你也可以传递一个字符串,它应该是一个脚本类的名称。

您可以指定T必须遵守的类型UnityEngine.Component来解决此问题。看起来像这样:

public abstract class ObjectPooling<T>: MonoBehaviour where T : UnityEngine.Component 
{

    public static float start = 30;
    public static bool extendable = true;

    public List<T> objects = new List<T>();

    public abstract T getNext();
    public abstract void Add(T obj);

    static T m_instance;
    public static T instance
    {
        get
        {
            return m_instance ?? (m_instance = CreateInstance());
        }
    }

    protected static T CreateInstance()
    {

        GameObject g = new GameObject("ObjectPooling");
        //this is where your compiler could not tell if T was the correct type by the way...
        var c = g.AddComponent<T>(); 
        return c;
    }
}

但这可能会破坏使用带有名称的字符串将脚本添加为游戏组件的功能。 (虽然我认为在你的情况下,它不会成为一个问题)