項目在切換場景或者是關閉Unity運行界面的時候,出現Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)錯誤。原因是我在一個不銷毀的單利里面,定義了一個事件,在外部去注冊這個事件。
/// <summary> /// 數據改變通知的事件 /// </summary> public GameDataDel GameDataHandle;
public static SaveGameData _instance; public static SaveGameData Instance { get { if (_applicationIsQuitting) { return null; } if (_instance == null) { GameObject go = new GameObject("SaveGameData"); SaveGameData saveGameData = go.AddComponent<SaveGameData>(); DontDestroyOnLoad(go); _instance = saveGameData; } return _instance; } }
外面事件的注冊
private void OnEnable() { Ctr_PlayerInfo.OnShowLifeNumEve += OnFreshLifeNum; SaveGameData.Instance.GameDataHandle += OnFresh; } private void OnDisable() { if (Ctr_PlayerInfo.OnShowLifeNumEve != null) { Ctr_PlayerInfo.OnShowLifeNumEve -= OnFreshLifeNum; } if (SaveGameData.Instance!= null) { SaveGameData.Instance.GameDataHandle -= OnFresh; } }
當我退出時,應用程序對象會以隨機順序被銷毀。因此,如果gameManager實例在任何OnDisable()方法之前被銷毀,那么在應用程序退出導致錯誤后,將創建gameManager類的新實例!!為了解決這個錯誤,我做了以下修改:
public static SaveGameData _instance;
private static bool _applicationIsQuitting = false;
public static SaveGameData Instance
{
get
{
if (_applicationIsQuitting)
{
return null;
}
if (_instance == null)
{
GameObject go = new GameObject("SaveGameData");
SaveGameData saveGameData = go.AddComponent<SaveGameData>();
DontDestroyOnLoad(go);
_instance = saveGameData;
}
return _instance;
}
}
public void OnDestroy()
{
_applicationIsQuitting = true;
}
