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梳妆结构。

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

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

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

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

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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");
}
 
}

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

 
 
1
Global.instance.DoSomeThings();
方案3:把使用DontDestroyOnLoad的脚本进行静态初始化,在静态初始化的时候进行DontDestroyOnLoad操作
public class Global:MonoBehaviour
{
public static Globalinstance;
static Global()
{
GameObjectgo=newGameObject("Globa");
DontDestroyOnLoad(go);
instance=go.AddComponent();
} public voidDoSomeThings()
{
Debug.Log("DoSomeThings");
} voidStart()
{
Debug.Log("Start");
}
}

最新文章

  1. (JS+CSS)实现图片放大效果
  2. 使用VS+VisualGDB编译Linux版本RCF
  3. ZOJ Problem Set - 1334 Basically Speaking ac代码及总结
  4. 学习zepto.js(对象方法)[5]
  5. 视觉机器学习读书笔记--------BP学习
  6. JavaScript学习笔记-对象
  7. 【转】TYVJ 1695 计算系数(NOIP2011 TG DAY2 1)
  8. [Mugeda HTML5技术教程之2] Mugeda HTML5富媒体平台简介
  9. Intro to Computer Science Class Online (CS101) - Udacity
  10. JNDI数据源配置注意事项
  11. hadoop2.x源码编译
  12. Python函数学习——递归
  13. Vue-详解设置路由导航的两种方法
  14. CMD 和 Git 中的代理设置
  15. win10 下安装 neo4j(转)
  16. 智能指针 - 现代C++新特性总结
  17. 一个高效的敏感词过滤方法(PHP)
  18. tf.FIFOQueue()
  19. Web前端表单验证
  20. Alpha事后诸葛亮(团队)

热门文章

  1. Android(java)学习笔记102:Dalivk虚拟机的初始化过程
  2. 【洛谷2522】[HAOI2011] Problem b(莫比乌斯反演)
  3. 将数据库数据添加到ListView控件中
  4. 数组逆序=全局内存版 VS 共享内存版
  5. Bootstrap 历练实例 - 折叠(Collapse)插件事件
  6. C#自减运算符
  7. VueX源码分析(3)
  8. 四、Shell 数组
  9. 零基础快速掌握Python系统管理视频课程【猎豹网校】
  10. nginx+django线上部署