我们尝试了将UI对象移动到另一个场景的不同方法,但我们失败了。 Over对象在Canvas中。
方法1:我们使用了LoadLevelAdditive,但是移动了第一个场景中的所有对象而没有使用Canvas的所有对象。
方法2:我们使用了DontDestroyOnLoad。我们需要在Canvas上更改我们的元素。 DDOL保存场景中的最后位置,但我们根本无法更改对象。
你能得到一些建议吗?
感谢。
答案 0 :(得分:3)
不要使用Application.LoadLevelXXX
。这些是已弃用的功能。如果您使用的是旧版Unity,请以其他方式更新,否则您可能无法使用以下解决方案。
首先,使用SceneManager.LoadSceneAsync
加载场景。将allowSceneActivation
设置为false
,以便加载后场景不会自动激活。
问题的主要解决方案是SceneManager.MoveGameObjectToScene
函数,用于将GameObject从一个场景转移到另一个场景。加载场景后调用,然后调用SceneManager.SetActiveScene
激活场景。以下是一个例子。
public GameObject UIRootObject;
private AsyncOperation sceneAsync;
void Start()
{
StartCoroutine(loadScene(2));
}
IEnumerator loadScene(int index)
{
AsyncOperation scene = SceneManager.LoadSceneAsync(index, LoadSceneMode.Additive);
scene.allowSceneActivation = false;
sceneAsync = scene;
//Wait until we are done loading the scene
while (scene.progress < 0.9f)
{
Debug.Log("Loading scene " + " [][] Progress: " + scene.progress);
yield return null;
}
OnFinishedLoadingAllScene();
}
void enableScene(int index)
{
//Activate the Scene
sceneAsync.allowSceneActivation = true;
Scene sceneToLoad = SceneManager.GetSceneByBuildIndex(index);
if (sceneToLoad.IsValid())
{
Debug.Log("Scene is Valid");
SceneManager.MoveGameObjectToScene(UIRootObject, sceneToLoad);
SceneManager.SetActiveScene(sceneToLoad);
}
}
void OnFinishedLoadingAllScene()
{
Debug.Log("Done Loading Scene");
enableScene(2);
Debug.Log("Scene Activated!");
}