将游戏对象移动/转移到另一个场景

9
我们尝试了不同的方法将UI对象移动到另一个场景,但是我们失败了。超过对象在画布中。
方法1:我们使用了LoadLevelAdditive,但是所有对象都被移动到第一个场景,而没有超过带有其元素的画布。
方法2:我们使用了DontDestroyOnLoad。我们需要在画布上更改元素。 DDOL在场景中保存最后位置,但我们根本无法更改对象。
请问您能提供一些建议吗?
谢谢。
1个回答

13

不要使用 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!");
}

1
非常感谢您! - gundenaf
请问我应该将您的脚本附加到哪个游戏对象上? - tmighty
1
@tmighty 你只需要将它附加到场景中处于活动状态的任何GameObject上,因为它使用了协程,所以GameObject必须启用。一个空的GameObject也可以。之后,从要移动到另一个场景的GameOBject中拖放到该GameObject上的脚本的UIRootObject变量中。被拖到UIRootObject插槽中的那个GameObject就是要移动到另一个场景中的对象,因为这就是我在代码中执行SceneManager.MoveGameObjectToScene(UIRootObject, sceneToLoad);时要移动的对象。 - Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接