2016-10-13 11 views
0

こんにちは私はobjectpoolingクラスに取り組んでおり、T "ObjectPooling"を持っています。 子供クラスを作った。だから私はこのクラスの自動シングルトンを作りたいと思っています。だから私は "インスタンス"を使用する場合は、m_instanceがnullであるかどうかをチェックする必要があります。 「はい」の場合はスクリプトを生成し、m_instanceを割り当てます。静的インスタンス作成が動作していないUnity3D C#抽象クラス

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()の最後の行にあります。 それは

Anが暗黙のうちに、私は私が今ここに何ができるかわからないのローカル変数の宣言は、 `UnityEngine.GameObject.AddComponent(のSystem.Type)と を初期化することはできません

を入力しました。と言います以前はObjectPoolingで試してみましたが、エラーはなく、動作していません。

私の目標は、子供がシングルトンも持っていることです。私は現在手動で行っていますが、私は後でこのようにしたいと思っています(基本クラスは子クラスではなく、それをチェックしてください)。

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

あなたは、私がGameObject.AddComponentではなく、「あらゆるタイプ」よりも、特定の型のオブジェクトを必要とするため、これはT = BulletBase

答えて

1

を持つ新しいChildclassで働いていますここで見ることができます。 ObjectPoolingクラスでは、どの型のオブジェクトでも指定できるだけで、コンパイラは事前に使用している型を推測できません。

AddComponentは、スクリプトクラスの名前にする必要がある文字列を渡すこともできるので、厄介な機能です。

これを回避するには、Tに従うタイプを指定してUnityEngine.Componentと指定できます。

しかし、それは名前を持つ文字列を使用してスクリプトをゲームコンポーネントとして追加する機能を無効にする可能性があります。 (私はあなたの場合、それは問題ではないと思うが)

+0

あああなたは正しいです。完全に忘れました。そうですか。しかし、私は大きな間違いを犯したと思う。子クラスのインスタンスを後で "BulletPooling.instance.getNext()"を使用するようにしたかったのですが、インスタンス上にカーソルを置くと "BulletBase ObjectPooling .instance {get;}が間違っています。 "BulletPooling BulletPooling。インスタンス{get; } "うーん、私はそこに再加工が必要だと思う。これがうまくいくかどうか分からない – MaZy

関連する問題