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

0 unity-game-engine

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

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

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

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

Eve*_*rts 5

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

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

当您返回创建该对象的场景时,Unity 将在现有实例之上添加一个新实例。该对象的唤醒将被运行,并且由于实例变量不为空,它将跳转并销毁这个新实例。旧的不再调用 Awake,因此它不会受到影响。