2017-05-05 73 views
0

因此,我在DontdesoryOnload的開始場景中管理這個管理器,管理所有的UI等。它遵循單例模式,所以如果我去場景2並返回到我的開始場景,第一位經理將保持不變,而新開場的經理人會認爲已經有一位經理人,並且會摧毀自己。Unity:Singleton DontDestoryOnLoad腳本虛假參考

從這裏我們調用Manager保持活着Manager-Singleton和按計劃銷燬經理Manager-Dead。

我遇到的問題是,在我的經理,單身的引用似乎是錯誤的參考。

當Manager-Dead按計劃銷燬時,如果我訪問我的Manager-Singleton下的公共GameObject,它會向我顯示一個錯誤。如果我點擊Inspector中的References字段,它會將我引導到正確的Gameobject,這個Gameobject根本就不會失效。但是,如果我避免Manager-Dead被破壞(所以在一個場景中會有兩個管理員),代碼工作得很好。

我知道你可能會想,如果場景中有兩個管理員,可能會出現UI重疊,以便我可以單擊ManagerDead的按鈕並訪問其引用。所以在我回到開始場景後,我手動禁用了ManagerDead。事實證明,ManagerSingleton正在改變ManagerDead的用戶界面!

我真的搞不清楚它出錯的地方。任何建議,將不勝感激。

以下是我的一些代碼的情況下,他們可能是有用的:

[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 Gameobjects。