问题场景
假设在 Scene A中包含一个GameObject S ,在其某个MonoBehaviour脚本中,执行了如下方法:
private void Awake()
{
s_instance = this;
GameObject.DontDestroyOnLoad(gameObject);
}
这样,当Scene A载入时,GameObject S 在Awake 之后将被放入一个名字为DontDestroyOnLoad 的自动创建的Scene中,同时从Scene A移出。 之后,当载入新Scene(非Additive模式)时,Scene A将卸载,其中所有GameObjects将被Destroy。而DontDestroyOnLoad 这个Scene继续存在,因此GameObject S 也继续存在于这个Scene中,不会被删除。
问题出现
当从其他Scene再次载入Scene A时,由于此时的Scene A是重新创建的,因此一个新的GameObject S 被创建,且调用Awake 。此时再次调用Awake中的DontDestroyOnLoad 方法,会发现没有任何效果。新的GameObject S 还是在新的SceneA中,DontDestroyOnLoad Scene 中还是有那个老的GameObject S 。这样最终一共会有两个GameObject S ,这显然不是我们想要的。因为这种不删除的GameObject,一般是作为一个单例存在。
问题解决
解决方法很简单,在GameObject S 的脚本的Awake 方法中,判断单例是否存在,如果已经存在,则直接删除这个新生产的GameObject对象即可:
private void Awake()
{
if (s_instance != null)
{
Destroy(gameObject);
}
else
{
s_instance = this;
GameObject.DontDestroyOnLoad(gameObject);
}
}
|