如何在加载场景时再次创建游戏对象(如果已存在)

时间:2016-03-09 11:08:21

标签: unity3d

在我的应用程序中测试场景时,我确实意识到每次回到主场景(带菜单的场景)时,我都会再次创建一个持久对象。

这个持久对象是我用来附加游戏管理器脚本的对象,因此任何时候都应该只有一个。问题是,如果我回到主菜单;加载一个场景后,它会再次被创建,所以我最终得到了两个相同的游戏对象。

有没有办法避免这种情况;告诉Unity如果游戏对象已经存在,不要再创建它吗?

我可以解决这个问题,创建一个“启动”场景,启动一次,永远不会再次加载(所以启动场景调用主菜单);但它感觉很奇怪,所以我想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:3)

private static ClassType instance = null;
void Awake(){
    if(instance == null)
    {
        instance = this;
        DontDestroyOnLoad(this.gameObject);
        return;
    }
    Destroy(this.gameObject);
}

唤醒在对象的生命周期中只被调用一次。所以第一个创建的将被唤醒,它将自己注册为实例。静态仍然在场景加载,因此它被标记为DontDestroyOnLoad。

当您回到创建该对象的场景时,Unity将在现有对象的基础上添加新实例。将运行该对象的唤醒,并且由于实例变量不为null,它将跳转并销毁此新实例。旧的不再叫Awake,所以它不会受到影响。

答案 1 :(得分:0)

您可以使用DontDestroyOnLoad。所以你可以简单地拖放你的游戏对象,它不会破坏它的第一个场景。所以不需要在每个场景中添加相同的游戏对象。

此外,如果您想使用Singleton模式,可以使用this