【Unity报错】Some objects were not cleaned up when closing the scene.

文章讨论了Unity在结束运行时可能出现的错误:Someobjectswerenotcleanedupwhenclosingthescene。原因是OnDestroy方法调用顺序不确定,可能在单例类被销毁后仍尝试使用。解决方案是在单例类中添加一个静态变量applicationIsQuitting,在OnDestroy时设置为true,避免在应用退出时创建新对象。同时建议在调用单例于OnDestroy时进行条件检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

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方法,加一个判断条件

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中调用单例最好用?来限定

	private void OnDestroy() {
        Debug.Log("TestMonoManager:" + TestMonoManager.Instance?.score);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个人心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值