[英]Unity: Singleton DontDestoryOnLoad script false reference
因此,我在DontdesoryOnload的起始场景中有一位经理,该经理负责所有UI,等等。它遵循单例模式,因此,如果我转到场景2并返回到起始场景,则第一个经理将保持不变,并且在新打开的启动场景中,经理将认为已经有一个经理,并自行销毁。
在这里,我们将Manager称为存活的Manager-Singleton,并将其销毁为计划的Manager-Dead。
我遇到的问题是Manager-Singleton中的引用似乎是虚假引用。
当按计划销毁Manager-Dead时,如果我在Manager-Singleton下访问一个公共GameObject,它将显示一个错误。 如果在“检查器”中单击那些“引用”字段,它将带我到没有被破坏的正确Gameobject。
MissingReferenceException: The object of type 'GameObject' has been destroyed, but you are still trying to access it.
但是,如果我避免销毁Manager-Dead(因此,在一个场景中将有两名经理),那么代码就可以正常工作。
我知道您可能在想,如果场景中有两个经理,则可能会有一个UI重叠,因此我可能单击ManagerDead的Button并访问其References。 因此,回到“开始”场景后,我手动禁用了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> ();
}
}
解决了问题,组件引用部分是引起问题的原因,由于_UIManager等是静态的,这意味着在Manager-Dead的Awake函数中调用组件引用时,即使销毁了该引用,也将引用这些引用对其下面的GameObject。
这导致来自Manager-Singleton的静态_UIManager将被引用到Manager-Dead下的Destroyed Gameobjects。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.