一、定义
void GameObject.DontDestroyOnLoad(Object obj)
它的作用是让某物体创建之后不再随场景的切换而销毁。这是很有用的,比如联网模块、音效模块,作为网游肯定是时刻存在的,那么它们所绑定的物体自然就不允许销毁。
往往这类模块都是使用的都是单例模式或静态对象来实现的。切记不要对同一个对象多次调用该方法
二、代码示例
在场景A、B分别两次Create Empty(一共创建4个GameObject),将如下代码绑定到上述4个对象上
切换代码脚本,见我上一篇博文
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KeepAllInLevel : MonoBehaviour {
private static bool isFirstInit;
static KeepAllInLevel()
{
Debug.Log("Global");
isFirstInit = true;
}
// Use this for initialization
void Start () {
Debug.Log("Start");
if (isFirstInit)
{
isFirstInit = false;
Debug.Log("not destroy");
DontDestroyOnLoad(this.gameObject);
}
}
// Update is called once per frame
void Update () {
Debug.Log("update " + name);
}
}
结论:
1、Global只打印一次,说明了静态构造函数只会被系统调用一次,而MonoBehaviour的Start是每个绑定的对象都会调用一次的。
2、静态变量和静态方法都是绑定在类上的。它们不会随着对象的销毁而消失。因此这里的DontDestroyOnLoad方法只会被调用一次。
3、对象3和对象4之所以存在是因为场景B还没被切换掉,如果切换成其它场景,那么只有DontDestroyOnLoad的对象2会遗留下来。