2017-09-18 15 views
0

Unityにバグがあります。Unityシングルトンパターン

私たちはしばしばゲームマネージャーのようなシングルトンオブジェクトを使用します。これを行うには2通りの方法があります。

一つは次のようにシャープなクラスC Singleton.csを使用することです。その後、

using System; 
using System.Linq; 
using UnityEngine; 

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour 
{ 
    static T instance; 

    DateTime BirthTime; 

    public static T Instance 
    { 
     get 
     { 
      if (instance == null) 
       Initialize(); 

      return instance; 
     } 
    } 

    private void Awake() 
    { 
     BirthTime = DateTime.Now; 
    } 

    public static void Initialize() 
    { 
     if (instance == null) 
      instance = FindObjectOfType<T>(); 
    } 
} 

や人気の意見では

GamaManager : Singleton<GameManager> 

として私たちのGameManagerを導き出し、この方法は、特に上、CPUを消費しますUnityはシングルトンで言及されているInitializeメソッドを使用するために非常に多くのオブジェクトの階層を反復処理する必要があります。その何度も何度も同じコードを書くように、

GameManager : MonoBehaviour 
{ 
    public static GameManager Instance { get; private set; } 

    void Start() 
    { 
     Instance = this; 
    } 
} 

しかし、私は思う:

単純なアプローチは、プライベートインスタンスを作成してスタートまたはアウェイクでそれを初期化することです。誰もこれに対してよりクリーンなアプローチを提案できますか?

+0

。 – Jajan

答えて

0

あなたのゲームマネージャークラスが一般的なシングルトンクラスを継承し、このタイプのgameobjectの検索を避けたらどうなりますか?たとえば :

public class Foo : Singleton<Foo> 

あなたのFooクラスは、あなたが目を覚ましに初期化できる「インスタンス」プロパティにアクセスする必要があります。

+0

これは正確に前述のクラスがどのように使用されているか(OPはそれをコードで示しています)、OPの問題に完全には対応していません。 'Initialize()'はシングルトンの既存のインスタンスをシーンで検索することを意味します。シングルトンで 'DontDestroyOnLoad()'を呼び出した後に新しいシーンをロードすると発生する可能性があります。その場合、新しいものを初期化する必要はありません。既存のものへの参照を取得する必要があります。 OPは、シーン内でそのオブジェクトを見つけるより効率的な方法があるかどうかを尋ねています。 – Serlite

1

私はあなたが正確に何をしたいかわからないんだけど、シングルトンパターンで、私はGameManagerのようなメインクラスを作成し、コードのこの部分を使用してシングルトンクラスとして設定好む:

static GameManager _instance; 
    public static GameManager instance { 
     get { 
      if (!_instance) { 
       _instance = FindObjectOfType<GameManager>(); 
      } 
      return _instance; 
     } 
    } 

それとも作品あなたが書いたコードの後に​​、他のサブマネージャータイプに応じて変数を定義し、GameManagerシングルトンでそれらにアクセスします。例えば

public BulletManager myBulletManager; 

とこのようにそれを使用します。私は唯一の他の方法を考えることができ

GameManager.instance.myBulletManager.Fire(); 
関連する問題