Unity3D之DontDestroyOnLoad的坑
来源:互联网 发布:兰印婚礼知乎 编辑:程序博客网 时间:2024/06/06 00:46
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("Global"); DontDestroyOnLoad(go); instance = go.AddComponent<Global>(); } public void DoSomeThings() { Debug.Log("DoSomeThings"); } void Start () { Debug.Log("Start"); }}
这样这条脚本就类似一个静态脚本了,而且这个游戏对象也永远不会因为切换场景而被销毁。而且用起来非常方便。在需要调用它的地方直接调用就行了。
Global.instance.DoSomeThings();
本文转自:http://www.xuanyusong.com/archives/2938
- Unity3D之DontDestroyOnLoad的坑
- Unity3D研究院之DontDestroyOnLoad的坑
- Unity3D研究院之DontDestroyOnLoad的坑
- Unity3D研究院之DontDestroyOnLoad的坑
- DontDestroyOnLoad(Unity3D开发之五)
- unity3d关于方法DontDestroyOnLoad的研究
- Unity3D -- DontDestroyOnLoad重复实例化的问题
- DontDestroyOnLoad带来的麻烦
- Unity3d面试6 DontDestroyOnLoad();PlayerPrefs;协同程序;游戏框架;Unity中播放视频;LOD技术
- 关于DontDestroyOnLoad与单例一起的使用
- Object.DontDestroyOnLoad
- u3d DontDestroyOnLoad
- Unity3d 开发之 ulua 坑的总结
- Unity3D之UILabel的用法
- Unity3D之Button的封装
- unity3D之摄像机的调换
- Unity3D之UIToggle的使用
- Unity3D之Position的设置
- 机器学习开篇第一博
- Java的第20年:Java和我的故事
- 错误:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor
- bzoj1682
- stl容器的遍历效率分析
- Unity3D之DontDestroyOnLoad的坑
- The first day to write to blog
- CRON expression syntax
- Android AutoLayout全新的适配方式 堪称适配终结者
- openjudge4010: 2011(java BigInteger)
- Java之ClassLoader读取文件
- PHP7新特性
- Java线程:概念与原理
- wamp 点击“Your Projects”下面项目名,显示错误