2017-05-05 23 views
0

私はDontdesoryOnload、そのマネージャー、すべてのUIなどでスタート・シーンにこのマネージャーを持っています。シングルトン・パターンに従っています。シーン2に行って開始シーンに戻ると最初のマネージャーは同じままであり、新しく開かれた開始シーンのマネージャーは、すでにマネージャーがいると分かり、それ自身を破壊します。Unity:シングルトンDontDestoryOnLoadスクリプトfalse参照

ここから、マネージャーは存続しているマネージャーシングルトンと、計画マネージャーデッドとして破棄されたマネージャーとしましょう。

私が抱えている問題は、私のマネージャー - シングルトンの参照が誤って参照されているようです。

Manager-Deadが計画どおりに破棄された場合、Manager-Singletonの下でPublic GameObjectにアクセスすると、エラーが表示されます。 InspectorのReferencesフィールドをクリックすると、まったく破壊されていない正しいGameObjectにつながります。私が破壊されるからマネージャー・デッド避ける場合

MissingReferenceException: The object of type 'GameObject' has been destroyed, but you are still trying to access it. 

しかし、(だから、1つのシーンで2つのマネージャが存在します)、コードがうまく働きました。

シーンに2人のマネージャーがいる場合、ManagerDeadのボタンをクリックしてその参照にアクセスするようにUIオーバーラップが存在する可能性があります。だから私がスタートシーンに戻った後、私は手動でManagerDeadを無効にします。 ManagerSingletonがManagerDeadのUIを変更していることが判明しました!

どこが間違っているのか本当に分かりませんでした。任意の提案をいただければ幸いです。続き

は、彼らが役に立つかもしれない場合は、私のコードの一部です:解決

[RequireComponent(typeof(UIManager))] 
[RequireComponent(typeof(DataManager))] 
[RequireComponent(typeof(StateManager))] 
public class Managers : MonoBehaviour { 

    private static UIManager _UIManager; 
    public static UIManager UI 
    { 
     get { return _UIManager; } 
    } 

    private static DataManager _DataManager; 
    public static DataManager Data 
    { 
     get { return _DataManager; } 
    } 

    private static StateManager _StateManager; 
    public static StateManager State 
    { 
     get { return _StateManager; } 
    } 

    public string debugString = ""; 

    void Awake(){ 
     //Only one dataControl obj is allowed to exist and pass along. 
     if (GameObject.FindObjectsOfType<Managers>().Length > 1) { 
      Destroy (gameObject); 
     } else { 
      DontDestroyOnLoad (gameObject); 
     } 

     _UIManager = GetComponent<UIManager>(); //!!!!! This is a Singleton class. 
     _DataManager = GetComponent<DataManager>(); 
     _StateManager = GetComponent<StateManager>(); 
    } 
} 

答えて

0

問題_UIManagerなどが静的であるので、一部を参照するコンポーネントは、トラブルの原因となっているものであるコンポーネントを参照するとき、それは意味しますManager-DeadのAwake関数で呼び出されると、破棄された後でもGameObjectsの参照を参照します。

この結果、Manager-Singletonのスタティック_UIManagerはManager-DeadのDestroyed Gameオブジェクトに参照されます。

関連する問題