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");
}
}

【转】Unity3D研究院之DontDestroyOnLoad的坑的更多相关文章

  1. Unity3D研究院之DontDestroyOnLoad的坑

    http://www.xuanyusong.com/archives/2938 Unity中的一个方法DontDestroyOnLoad可以让某些游戏对象在切换场景的时候不是施放,听起来是一个非常好的 ...

  2. Unity3D研究院之Jenkins的使用(七十八)

    长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内 ...

  3. Unity3D研究院之与Android相互传递消息

    原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了. ...

  4. Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条

    Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ...

  5. (转)Unity3D研究院之Assetbundle的实战(六十三)

    上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院之Assetbundle的原理(六十一) 本篇文章我们将说说assetbundl ...

  6. (转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景

    自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平 ...

  7. Unity3D研究院之Assetbundle的实战(六十三)

    http://www.xuanyusong.com/archives/2405 上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院 ...

  8. 【转载】Unity3D研究院之IOS&Andoird使用Sharesdk遇到的坑

    这两天研究了一下ShareSDK,说实话挺好用的,但是还是有点坑的地方.那么雨松MOMO写下博文记录一下来我遇到的坑,嘿嘿. 大部分内容它的文档上已经说的很清楚了. http://wiki.share ...

  9. 【转】Unity3D研究院之通过C#使用Advanced CSharp Messenger(五十)

    http://www.xuanyusong.com/archives/2165 Advanced CSharp Messenger 属于C#事件的一种. 维基百科中由详细的说明http://wiki. ...

随机推荐

  1. linux 命令——37 date (转)

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数 ...

  2. POJ-1459 Power Network---最大流

    题目链接: https://cn.vjudge.net/problem/POJ-1459 题目大意: 简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人),给你n个点,其中有 ...

  3. python_40_通过脚本转换参数实现替换

    import sys f=open('yesterday','r',encoding='utf-8') f_new=open('yesterday_update','w',encoding='utf- ...

  4. Drupal7新装一个主题时页面白屏,如何设置一个默认主题?

    问题: 请问我不小心退出登陆了 但这个主题没有登录口 而且之前不知道为什么我其他界面都不能显示内容所以 ?q=user 也不行,怎么办呢?看网上说更换默认主题 去variable表里把默认主题换了,我 ...

  5. oc字符串截取 数组字典运用

    #define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS_ ...

  6. HDU 2045 LELE的RPG难题

    递推 枚举起点状态 #include <algorithm> #include <iostream> #include <cstring> #include < ...

  7. ABAP读取长文本的方法

    SAP中所有的项目文本都存在以下两张数据表中: 1. STXH  抬头项目文本 透明表 2. STXL  明细项目文本   透明表 长文本读取方法 首先在STXH和STXL中根据OBJECT NAME ...

  8. 十、Shell 函数

    Shell 函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action ...

  9. 一个手机号可以注册绑定5个百度网盘,永久2T

    效果: 一个手机号可以注册绑定5个百度网盘,得永久2T硬盘 手机号只能做为其中一个网盘的登陆账号,其它四个用绑定qq登陆(微信应该也可以). 条件: 2个手机号:A(用来绑定百度网盘),B(用来申请网 ...

  10. Codeforces Round #443 (Div. 2) C 位运算

    C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...