项目场景:
Unity结束运行的时候报错Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)
问题描述
结束运行的时候突然报错,有概率,有时候有有时候没有
原因分析:
结束运行的时候在OnDestroy中调用了Mono的单例类,但是呢OnDestroy调用次序是不同的,有可能A先B后,也有可能是B先A后。
所以导致单例类先销毁了,然后在某个脚本中的OnDestroy中又调用了该单例类。导致又创建了一次。
注意:在停止运行或者切换场景的时候不要在OnDestroy中生成对象
但是对于自动Mono单例来说切换场景不影响,因为添加了DontDestroyOnLoad
public class MonoBaseManagerAuto<T> : MonoBehaviour where T: MonoBehaviour {
protected MonoBaseManagerAuto() { }
private static T _instance = null;
public static T Instance {
get {
if (_instance == null) {
//不存在就创建对象
GameObject obj = new GameObject(typeof(T).Name);
_instance = obj.AddComponent<T>();
DontDestroyOnLoad(obj); //不自动销毁
}
return _instance;
}
}
}
解决方案:
在Mono单例中抽象OnDestroy方法,加一个判断条件文章来源:https://www.toymoban.com/news/detail-787404.html
public class MonoBaseManagerAuto<T> : MonoBehaviour where T: MonoBehaviour {
public static bool applicationIsQuitting = false;
protected MonoBaseManagerAuto() { }
private static T _instance = null;
public static T Instance {
get {
if (_instance == null) {
if (applicationIsQuitting) {
//如果销毁了则直接返回,不能再创建
return _instance;
}
//不存在就创建对象
GameObject obj = new GameObject(typeof(T).Name);
_instance = obj.AddComponent<T>();
DontDestroyOnLoad(obj); //不自动销毁
}
return _instance;
}
}
protected virtual void OnDestroy() {
applicationIsQuitting = true;
}
}
在写代码的时候如果要在OnDestroy中调用单例最好用?来限定文章来源地址https://www.toymoban.com/news/detail-787404.html
private void OnDestroy() {
Debug.Log("TestMonoManager:" + TestMonoManager.Instance?.score);
}
到了这里,关于【Unity报错】Some objects were not cleaned up when closing the scene.的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!