关于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万+

FAGLB03余额显示异常排查与修复指南

本文针对SAP新总账中FAGLB03报表余额显示异常问题,提供了专业的排查与修复指南。文章深入剖析了数据不一致的核心原因,如FAGLFLEXT汇总表与凭证明细不同步、年度余额结转(FAGLGVTR)失败等,并详细介绍了使用FAGLF03进行精准诊断、通过SE38执行标准调整程序TFC_ADJUST_VZ进行修复的标准操作流程,帮助用户快速恢复数据一致性,确保财务报表的准确性。

weixin_29313423的博客 307

车辆横向控制MPC实战:从‘老王模型’到CasADi求解的保姆级避坑指南

本文详细解析了车辆横向控制MPC的实战应用,从经典动力学模型选择到CasADi求解器的优化配置,提供了一套完整的避坑指南。重点介绍了车辆动力学模型的验证要点、CasADi环境的高效配置技巧以及MPC问题建模的核心要素,帮助开发者快速实现稳健的横向控制方案。

weixin_42524499的博客 346

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

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

悲欢离合的博客 5723

多模态情感识别(MER)数据集实战指南:从IEMOCAP到应用落地

本文提供了多模态情感识别(MER)从数据集到应用落地的完整实战指南。以经典IEMOCAP数据集为例,详细讲解了音频、视觉、文本等多模态数据的预处理、特征提取与融合技术,并分享了模型训练调优心得及面向智能客服、在线教育等场景的部署考量,帮助开发者快速构建高效可用的MER系统。

h3i4j的博客 1072

unity DontDestroyOnLoad使用详解

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

qq_40666620的博客 8923

SAP生产订单(创建-下达-发料-报工-入库)全流程及反向流程

SAP创建下达报工入库发料以及取消发料取消入库,批量下达删除关闭,生产订单出入库查询和状态更改查询记录

weixin_38974136的博客 2万+

实战拆解:RAG vs Agent在金融风控中的性能对比

2024年上半年我帮某华东地区城商行做零售交易反欺诈系统升级时,技术团队曾发生过一次激烈争论:一派认为应该优先上RAG(检索增强生成)方案,成本低、落地快、合规性好;另一派坚持要上Agent(智能体)方案,推理能力强、能应对复杂新型欺诈。最终我们做了完整的AB测试,结论是两者没有绝对的优劣,只有场景适配的差异:RAG适合高并发、低时延的实时风控场景,Agent适合低并发、高准确率要求的事后核查/大额审批场景,两者结合的 hybrid 方案能覆盖95%以上的风控需求。本文我会结合真实项目的测试数据,从核心概念

AI天才研究院 252

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

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

QuickCode的博客 414

Veeam Backup & ONE download

前言 Veeam® Availability Suite™ 是 Veeam 的旗舰解决方案,可实现简单、灵活和可靠的数据管理。消除与数据保护、恢复、监控、勒索软件防护和合规性相关的手动流程,从而减轻数据维护压力。Veeam 能够帮助您节省时间和成本,同时支持您减少在备份方面花费的时间,将更多精力放在推动业务发展上。 Veeam Availability Suite Release 版本 包含 发布时间 复制磁力链接使用迅雷或者bittorrent ...

极致,细节 2005

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

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

BreakVein的博客 509

NVIDIA驱动版本太低?手把手教你解决CUDA与PyTorch版本冲突问题

本文针对深度学习开发中常见的NVIDIA驱动版本过低导致的CUDA与PyTorch版本冲突问题,提供了从根源理解到实战解决的完整指南。文章详细解析了驱动、CUDA与PyTorch的依赖关系,并给出了升级驱动、降级PyTorch、使用Conda环境管理及Docker容器化四种核心解决方案,帮助开发者快速诊断并构建稳定的GPU开发工作流。

grpc6streamer的博客 971

基于Cesium移动的天空云

天空中的云朵也算是一种天气气候的效果,它能更加逼真的反映当前的天气状况,可以是白云朵朵,也可以是乌云密布,结合其他天气效果,可以组合形成较为真实的三维可视化场景。

星云数海的博客,一个专注GIS十多年的GISer人。 449

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

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

ProcePerch的博客 531

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

DeepNest的博客 358

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

SimProceed的博客 361

你还在手动保留对象吗?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、付费专栏及课程。

余额充值