Unity中如何从切换场景中保存特定对象

109 阅读2分钟

通常方法

以从Welcome场景中保存GameManager对象到GameScene场景为例

第一步,我们要先在Welcome场景中的一个脚本中,将GameManager对象设置为“DontDestroyOnLoad”

    void Start()
    {
        DontDestroyOnLoad(transform.gameObject);  // 过场景不移除
    }

第二步,在合适的位置添加切换场景的代码:

SceneManager.LoadScene("GameScene");

切换场景后,会有一个 DontDestroyOnLoad 的空世界生成,带有我们设置为不移除的物体 由于切场景之后想留存的物体在Hierarchy窗口出现了两个场景,看着可能有点别扭,但其实并没有影响,我们可以直接使用诸如 Find() 和 GetComponent() 方法调用到物体的信息。

image.png

被 DontDestroyOnLoad() 函数调用过的物体可以理解为会“留有某些标记”,如果使用 Instantiate() 尝试将他们实例化到普通场景下,他们也会自动生成到 DontDestroyOnLoad 场景。目前没有发现其他办法可以规定被标记为“不移除”的物体生成到特定场景。

其他方法

除上述方法以外,还有一些方法可以同样满足切换场景不移除物体的效果。 比如可以使用场景加载器(SceneLoader),加载其他Scene的物体:

  1. 在Unity中创建一个空物体(GameObject),并将其命名为"SceneLoader"。
  2. 创建一个C#脚本并将其附加到"SceneLoader"物体上。
  3. 在脚本中创建一个公共变量来存储场景加载器(SceneLoader),例如:
  4. 在Start方法中实例化场景加载器并加载其他Scene的物体,例如:
	public SceneLoader sceneLoader;

	void Start()  
	{  
	    sceneLoader = GetComponent<SceneLoader>();  
	    sceneLoader.Load("OtherSceneName");  
	}

其中,"OtherSceneName"是您要加载的Scene的名称。

.

还可以将物体在调用时连同脚本制作成 Prefab,用数据持久化的方法将其做到“克隆” ————先加载 prefab,再将其数据导入到其中。不过这种方法较为繁琐且不适合携带大量数据的物体,不建议大家使用。