关于DontDestroyOnLoad与单例一起的使用

Unity DontDestroyOnLoad原理与单例持久化实战指南 DontDestroyOnLoad是Unity中实现跨场景对象存活的核心机制,其本质并非‘永生保障’,而是引擎在场景卸载阶段执行的根对象迁移指令。它通过将标记的GameObject及其子树移入隐藏的DontDestroyOnLoad Root场景,绕过自动销毁流程,从而支撑 GameManager、AudioManager 等全局服务的连续运行。但该机制存在严格限制:仅对根对象生效、不保证组件状态一致性、易引发资源引用断裂与生命周期错乱。结合单例模式时,静态Instance与场景对象生命周期的错配更会放大 阅读详情

本文转宣雨松的博客:
http://www.xuanyusong.com/archives/2938

Unity中的一个方法DontDestroyOnLoad可以让某些游戏对象在切换场景的时候不是施放,听起来是一个非常好的方法,但是其实如果没用好那么可能就是有问题了。

举个例子:

在场景1中某一个脚本的Start方法中,DontDestroyOnLoad(A)

接着切换到场景2中,理所当然A对象被保留了下来

如果在从2场景再次回到1场景,那么又执行了一遍DontDestroyOnLoad(A)然而之前你的A对象却没有被施放,这样就会无线循环下去了。

当然我们可以去做逻辑判断是否DontDestroyOnLoad,判断A是否等于Null做一些判断。但是我觉得这其实是下策。DontDestroyOnLoad方法其实更多的是去保存一个全局的游戏脚本,比如一些第三方的SDK你需要用这个脚本来做中间件的支持。

我目前的做法是,我做了一个初始化场景。在初始化场景里面我只做两件事,第一在初始化场景里面的某个游戏对象的全局脚本中,Start方法里我把这个场景里面的所有游戏对象全部设置成DontDestroyOnLoad,也就是切换场景时不销毁,比如NGUI的Root梳妆结构。

Object[] initsObjects = GameObject.FindObjectsOfType(typeof(GameObject));
foreach (Object go in initsObjects) {
    DontDestroyOnLoad(go);
}

第二,接着我在进入我的第一个游戏场景,也就是说我的逻辑永远不会在回返我的初始化场景。所以我也不会出现来回切场景DontDestroyOnLoad没有删除的问题。

还有一个巧妙的办法就是利用static 初始化方法,如下代码所示,当代码在调用Global类的时候

首先程序会进入static Global方法中,这个方法永远只会走一遍,所以我在这里创建一个GameObjcet,然后把Global这条脚本绑定上去,我在DontDestroyOnLoad这个对象。

using UnityEngine;
using System.Collections;

public class Global :MonoBehaviour
{
    public static Global instance;

    static Global()
    {
        GameObject go = new GameObject("Globa");
        DontDestroyOnLoad(go);
        instance = go.AddComponent<Global>();
    }

    public void DoSomeThings()
    {
        Debug.Log("DoSomeThings");
    }

    void Start () 
    {
        Debug.Log("Start");
    }

}

这样这条脚本就类似一个静态脚本了,而且这个游戏对象也永远不会因为切换场景而被销毁。而且用起来非常方便。在需要调用它的地方直接调用就行了。

Global.instance.DoSomeThings();
Unity跨场景单例权威方案:基于DontDestroyOnLoad的架构实践 在Unity游戏开发中,单例模式是管理全局唯一服务(如音频、游戏状态)的常用设计模式,它确保一个类只有一个实例并提供全局访问点。其核心原理是通过静态变量持有实例,并在首次访问时创建。然而,Unity引擎基于场景的生命周期管理机制,使得传统单例在场景切换时面临对象被销毁的挑战,导致数据丢失或功能失效。为解决这一问题,需要将单例模式与Unity的DontDestroyOnLoad机制相结合,实现对象的跨场景持久化。这项技术的核心价值在于构建稳定、可维护的游戏架构基础,尤其对于需要全局状态管理的中大型项目至关重要 阅读详情

相关推荐

Unity DontDestroyOnLoad失效原因与持久化单例可靠方案

DontDestroyOnLoad是Unity中实现跨场景对象持久化的基础机制,其本质并非‘永生’,而是将对象移入隐藏的DontDestroyOnLoadScene进行生命周期隔离。理解其生效时机(仅在SceneManager.LoadScene前的Pre-Load阶段有效)、作用对象限制(仅支持Scene GameObject、挂载其上的Component及Editor资产)和内存归属逻辑(对象脱离Active Scene导致FindObjectOfType失效),是规避NullReferenceExce

weixin_33725807的博客 321

Unity 中 DontDestroyOnLoad() 方法

往往不怎么清楚unity 这个方法的具体含义的时候,很容易犯一些令人苦笑不得的错误。比如,有一个物体挂载着一个脚本,里面执行了一句DontDestroyOnLoad(this)。乍看之下没任何问题。但是如果考虑下如下的情形,你是不是也曾经头疼过?比如:有多个场景之间来回切换,你会发现,你的这个挂载的脚本的物体越来越多。 其实,unity的官方API里说的很明确,加载下一个场景的时候,其他的资源都会被清掉,但挂载了这个脚本的物体会留在下一个场景中。这样造成的问题是,场景里有多个该脚本的实例,导致 ...

THUNDERDREAMER_OR的博客 1万+

Unity中解决DontDestroyOnLoad的坑

一:前言 我们经常要用到DontDestroyOnLoad来使一个GameObject在切换场景的时候不被销毁,例如现在我们有两个场景Scene1和

L的博客 1万+

Unity小技巧 - 关于DontDestroyOnLoad的使用以及Bug解决方式

Unity为我们提供了一个叫做DontDestroyOnLoad的方法,不清楚是干啥的? 不要紧! 我们通过实例来好好学习下。 开发过程中如果两个场景有共同的物体,是不是我们通常会做成预制体,然后在两个场景分别初始化的分别创建,这就造成了额外的一次初始化。有损性能,这个方法就可以帮助我们可以实现一个物体两个场景使用。 从方法名我们就可以看出,是不删除某个东西。事实上确实是这样。我们都知道切换场景的时候,如果不做特殊处理,上一个场景中的物体默认是会销毁清除的。如果使用该方法官方注释明确说明了在加载一个新的场景

空名先生 1万+

RTKLIB PPP与RTK_POST精密定位实战:从实时到事后处理的完整流程解析

本文详细解析了如何使用RTKLIB进行精密单点定位(PPP)的完整流程,涵盖从实时处理到事后处理(RTK_POST)的关键步骤。文章深入探讨了数据准备、软件配置、核心参数设置(如电离层、对流层、潮汐改正)以及常见问题排查,旨在帮助用户掌握高精度GNSS定位技术,实现从入门到精通的实战应用。

weixin_29047919的博客 282

UVM和System verilog笔记总结(四)

virtual sequence 即虚seq,用于管理多个实sequence的执行顺序。 下面有三个sequence,此时需要virtual sequence去管理这三个的顺序。 virtual sequence和virtual sequencer需要成对写,使用例化实的sequence和sequencer控制: 此时在virtual sequence里面启动,而不是之前在test.sv里面用default或start函数启动。具体方法如下:先例化 再启动,用 `uvm_do_on 实sequence

weixin_42655118的博客 643

Unity3D中DonotDestroyOnLoad()需要注意的方面

Unity3D中调用DoNotDestroyOnLoad()函数注意事项

悲欢离合的博客 5723

保姆级教程:在Windows/Linux双系统下搞定Microsemi Libero SoC v11.8安装与白银版License激活

本文提供了一份详细的Microsemi Libero SoC v11.8在Windows/Linux双系统下的安装与白银版License激活指南。涵盖环境准备、安装流程、License跨平台配置及常见问题排查,帮助开发者高效搭建FPGA开发环境。

weixin_30603633的博客 420

unity DontDestroyOnLoad使用详解

DontDestroyOnLoad(GameObject); 让此物体在场景销毁的时候不进行销毁,但是有几点需要注意 1、再次返回到此物体所在场景的时候,这个脚本所在的物体也不会例外的进行初始化,执行Awake(),Start()方法,所以要设计成单例的: 注意看注释 public class GameManager : MonoBehaviour { private static GameManager _instance; // 单例 public GameManager GameManager

qq_40666620的博客 8923

遥感生态指数(RSEI)——四个指数的计算

遥感生态指数是在4个生态指数的基础上通过主成分变换得出的一个评价生态环境质量的指标。因此,第二部分就是要分别计算出这4个指数的值。 ①首先,是绿度指数的计算,一般用归一化植被指数(NDVI) NDVI=(NIR-Red)/(NIR+Red) 在Bandmath工具中输入NDVI计算公式 (float(b4-b3))/(b4+b3) 其中,b3、b4分别是红波段和近红外波段 ②其次,是湿度计算。 WET = c1B1 + c2B2 + c3B3...

qq_41978498的博客 9万+

QT应用编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)

一、环境介绍 QT版本: 5.12.6 编译环境: win10 64位 目标系统: Android 完整工程源码下载地址(包含APK文件):https://download.youkuaiyun.com/download/xiaolong1126626497/19051696 二、功能介绍 本软件是一款BLE蓝牙串口调试助手,支持常规的发送和接收调试,BLE是低功耗类型蓝牙,在智能家居、物联网领域使用较多。BLE低功耗蓝牙一般不能直接使用手机进行连接,手机蓝牙默认都是工作在传统蓝牙模式,无法直接连接BL..

7663

从新手到专家:掌握DontDestroyOnLoad实现跨场景单例的5个关键步骤

掌握Unity C#单例DontDestroyOnLoad,实现跨场景对象持久化的5个关键步骤。详解适用场景、生命周期管理与常见陷阱规避,确保对象无缝过渡多场景。高效稳定,提升项目架构质量,值得收藏。

QuickCode的博客 414

第五节_PySide6基本窗口控件_主窗口和标签

本文介绍了PySide6中主窗口和标签控件的使用。主要内容包括: 窗口控件分类: QWidget是基础窗口部件,可作为独立窗口或子部件 QMainWindow提供标准应用程序框架,包含菜单栏、工具栏等 QDialog用于对话框,支持模态交互 主窗口创建: 演示了如何创建QMainWindow子类 实现了窗口居中、设置图标、状态栏等功能 提供了窗口几何信息的获取方法 QLabel标签控件: 继承自QFrame类 用于显示文本或图像 文章通过代码示例详细说明了主窗口的创建和使用方法,包括位置控制、图标设置等常见

su桥木的博客 1024

单例不“单”?DontDestroyOnLoad导致重复实例化问题全解析,附完美解决方案

解决Unity C#单例模式因DontDestroyOnLoad导致的重复实例化问题,详解常见场景与正确实现方法,确保场景切换时唯一实例。通过判空与销毁逻辑保障稳定性,适用于持久管理器开发,值得收藏。

BreakVein的博客 509

【实战】YOLOv5/v8模型→RK3588 NPU高效部署:模型转换/量化/精度调优完整指南​

摘要: 本教程详细介绍了YOLOv5模型在RK3588 NPU上的优化部署流程,重点解析了架构转换与量化技术。通过将检测头输出结构与decode操作分离,显著提升了模型在NPU上的兼容性和计算效率。LetterBox预处理方案有效保持图像宽高比,相比直接resize提升检测精度。INT8量化技术采用非对称量化策略,通过scale和zero_point参数实现浮点到整数的转换,在保证精度的同时大幅提升推理速度。实验表明,优化后的模型在RK3588上实现了高效的实时目标检测性能,为边缘AI部署提供了完整解决方案

LXY_LOVE36的博客 625

huggingface使用git上传model或者Dataset到HF,当然也可以上传代码,以及大文件,很哇塞!!!

huggingface使用git上传model或者Dataset到HF,当然也可以上传代码,以及大文件,很哇塞!!! 第一次使用时,需要使用设置系统全局的huggingface token,这。点击huggingface首页右上角的头像 → settings → access tokens,创建一个write权限的token,名字可以随便取。

拥抱具身智能,昇腾Ascend C 3107

【资深TA亲授】:从入门到精通DontDestroyOnLoad——Unity中真正可靠的单例实现方案

掌握Unity中真正可靠的单例实现方案,解决场景切换对象销毁难题。结合C#单例模式与DontDestroyOnLoad,详解持久化对象创建、生命周期管理及线程安全优化,适用于游戏全局管理器与音频控制器。稳定高效,避免重复实例,值得收藏。

ProcePerch的博客 531

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Unity性能优化核心技巧】:用DontDestroyOnLoad打造高效稳定单例系统的秘密

掌握Unity性能优化关键,详解C#单例模式结合DontDestroyOnLoad的高效实现方法。适用于跨场景持久化管理,确保对象不被销毁,提升运行稳定性与资源利用率。构建可靠游戏架构的必备技巧,值得收藏。

DeepNest的博客 358

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

为什么你的Unity单例在场景加载后失效?DontDestroyOnLoad正确用法详解

解决Unity场景切换时单例失效问题,掌握C#单例与DontDestroyOnLoad的正确结合方法。适用于游戏管理器、音频控制器等需跨场景持久化的对象,确保实例不被销毁。原理清晰、代码简洁,有效避免重复创建。值得收藏

SimProceed的博客 361

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

你还在手动保留对象吗?DontDestroyOnLoad与单例结合的最佳实践(仅限高手)

掌握Unity场景切换时对象持久化难题?本文深入解析Unity C#的单例DontDestroyOnLoad实现方案,结合自动生命周期管理与线程安全设计,适用于管理游戏全局状态、音频控制器等跨场景模块。高效稳定,避免重复创建与引用丢失,高手进阶必备技巧,值得收藏。

SimSolve的博客 1056

Unity DontDestroyOnLoad注意事项及单例写法

当使用DontDestroyOnLoad方法的时候需要销毁场景切换的时候新创建的物体,使用单例可以解决。 Class UImanager { public static UImanager Instance; private void Awake() { if (Instance != null) { Destroy(gameObject); return; } Instance

kuilaurence的博客 1006

你真的会用DontDestroyOnLoad吗?深入剖析C#单例生命周期管理的底层机制

掌握Unity C#单例与DontDestroyOnLoad的正确用法,解决跨场景对象持久化难题。详解生命周期管理机制、适用场景及内存优化技巧,避免常见内存泄漏问题。深入剖析底层原理,提升项目稳定性,值得收藏。

CompiWander的博客 387

【Unity游戏架构必修课】:DontDestroyOnLoad实现跨场景单例的权威方案

掌握Unity跨场景对象管理难题,本文深入解析Unity C#的单例DontDestroyOnLoad实现方案,涵盖适用场景、生命周期控制与内存优化要点。安全可靠的场景切换持久化设计,值得收藏。

VarFlow的博客 1020

Unity独立游戏基础:DontDestroyOnLoad单例和PlayerPrefer记录持久化数据

引言0: 这是一个适用于关卡切换和退出游戏时自动记录玩家数据的通用案例,虽然该例功能简易,旨在说明实现例子,但用了较多时间优化了常见bug(其实就是稍微学习了一下然后匆忙记录)。可拓展性较高。 引言1: 关于PlayerPrefer,个人在《Unity5权威讲解》中制作PUN多人游戏开房间记录玩家NickName时使用过,后在《Unity3D案例开发大全》的台球案例等里见过多次。本次实习,个人在搭载设置界面时,要求使用公司lua中的一个持久化API记录音效和音乐设置选项,记录过相关功能。而本次将结合Scen

qq_43587594的博客 629

揭秘Unity场景切换时对象销毁问题:如何用DontDestroyOnLoad实现持久化单例

解决Unity场景切换对象销毁难题,本文详解如何通过Unity C# 的单例 DontDestroyOnLoad 实现跨场景持久化。适用于音频管理、游戏状态保存等场景,确保对象不被释放,提升开发效率。方法简单可靠,值得收藏。

AlgoInk的博客 1111

从新手到专家:3步构建安全可靠的C#单例+DontDestroyOnLoad系统

掌握Unity C#的单例DontDestroyOnLoad,3步实现跨场景安全对象管理。适用于游戏全局管理器、音频控制等持久化需求,避免重复实例与内存泄漏。结构清晰、线程安全,兼容任意场景切换,值得收藏。

QuickTrans的博客 668
下一篇: 关于游戏开发,如何开发一款游戏(基于unity)
HelloCLanguage
博客等级 码龄10年 10粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值