Unity:Singleton DontDestoryOnLoad脚本错误引用

时间:2017-05-05 05:24:33

标签: c# unity3d singleton

所以我在DutdesoryOnload的开始场景中有这个经理,管理所有UI等等。它遵循单身模式,所以如果我去场景2并回到我的起始场景,第一个经理将保持同样,新开放的场景中的经理会发现已经有了经理,并且自我毁灭。

从这里开始,让我们打电话给经理仍然活着的经理 - 辛格尔顿和经理被破坏的经理 - 死亡。

我遇到的问题是我的Manager-Singleton中的引用似乎是错误的引用。

当Manager-Dead按计划销毁时,如果我在Manager-Singleton下访问公共GameObject,它将显示错误。如果我点击Inspector中的那些References字段,它将引导我到正确的Gameobject,它根本没有被破坏。

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

但是,如果我避免破坏经理死亡,(因此在一个场景中会有两个经理),代码工作得很好。

我知道你可能会想,如果场景中有两个管理器,可能会有UI重叠,这样我可能会点击ManagerDead的Button,并访问它的References。所以在我回到Start场景后,我手动禁用了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> ();
    }
}

1 个答案:

答案 0 :(得分:0)

问题解决了,组件引用部分是导致问题的原因,因为_UIManager等是静态的,这意味着当在Manager-Dead的Awake函数中调用组件引用时,它会将那些引用引用到GameObjects Under它甚至在它被摧毁之后。

这导致来自Manager-Singleton的静态_UIManager将被引用到Manager-Dead下的Destroyed Gameobjects。