参考自Unity3D研究院之DontDestroyOnLoad的坑
1.DontDestroyOnLoad可以保证Gameobject以及上面绑定的组件不会销毁,在处理全局控制的时候有用。
public class ExampleClass :[MonoBehaviour](http://www.jianshu.com/MonoBehaviour.html){
void Awake() {
DontDestroyOnLoad(transform.gameObject);
}}
2.使用DontDestroyOnLoad的时候需要注意的坑:
由于使用DontDestroyOnLoad的物体不会被释放掉,假设我们写了上面的代码,而物体所在的游戏场景又可以重复进入的时候,游戏物体就会在每次进入场景的时候创建一次,甚至可以无限创建下去,这样的处理明显不妥。
3.针对性的解决方案:
方案1:在每次调用DontDestroyOnLoad的时候,都去判断场景中是否有对应的物体,如果没有再去创建
public class ExampleClass :[MonoBehaviour](http://www.jianshu.com/MonoBehaviour.html){
void Awake() {
If(Gameobject.Find("GlobalController"))
DontDestroyOnLoad(transform.gameObject);
}}
方案2:把DontDestroyOnLoad的调用写到最初始的场景,并且保证相应的场景中不存在再次进入的可能性
方案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");
}
}
调用方便,也封装方便,同样的方法可以使用在单例等的构建上。
网友评论