通常方法
以从Welcome场景中保存GameManager对象到GameScene场景为例
第一步,我们要先在Welcome场景中的一个脚本中,将GameManager对象设置为“DontDestroyOnLoad”
void Start()
{
DontDestroyOnLoad(transform.gameObject); // 过场景不移除
}
第二步,在合适的位置添加切换场景的代码:
SceneManager.LoadScene("GameScene");
切换场景后,会有一个 DontDestroyOnLoad 的空世界生成,带有我们设置为不移除的物体 由于切场景之后想留存的物体在Hierarchy窗口出现了两个场景,看着可能有点别扭,但其实并没有影响,我们可以直接使用诸如 Find() 和 GetComponent() 方法调用到物体的信息。
被 DontDestroyOnLoad() 函数调用过的物体可以理解为会“留有某些标记”,如果使用 Instantiate() 尝试将他们实例化到普通场景下,他们也会自动生成到 DontDestroyOnLoad 场景。目前没有发现其他办法可以规定被标记为“不移除”的物体生成到特定场景。
其他方法
除上述方法以外,还有一些方法可以同样满足切换场景不移除物体的效果。
比如可以使用场景加载器(SceneLoader)
,加载其他Scene的物体:
- 在Unity中创建一个空物体(GameObject),并将其命名为"SceneLoader"。
- 创建一个C#脚本并将其附加到"SceneLoader"物体上。
- 在脚本中创建一个公共变量来存储场景加载器(SceneLoader),例如:
- 在Start方法中实例化场景加载器并加载其他Scene的物体,例如:
public SceneLoader sceneLoader;
void Start()
{
sceneLoader = GetComponent<SceneLoader>();
sceneLoader.Load("OtherSceneName");
}
其中,"OtherSceneName"是您要加载的Scene的名称。
.
还可以将物体在调用时连同脚本制作成 Prefab
,用数据持久化的方法将其做到“克隆” ————先加载 prefab,再将其数据导入到其中。不过这种方法较为繁琐且不适合携带大量数据的物体,不建议大家使用。