【问题标题】:Move/Transfer GameObject to another scene将游戏对象移动/转移到另一个场景
【发布时间】:2020-01-29 18:42:38
【问题描述】:

我们尝试了不同的方法将 UI 对象移动到另一个场景,但我们失败了。 Over object 在 Canvas 中。

方法 1:我们使用了 LoadLevelAdditive,但是从第一个场景中移动了所有对象,而没有使用它的元素覆盖 Canvas。

方法 2:我们使用了 DontDestroyOnLoad。我们需要更改 Canvas 上的元素。 DDOL 保存场景中的最后一个位置,但我们根本无法更改对象。

请给点建议好吗?

谢谢。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    不要使用Application.LoadLevelXXX。这些是不推荐使用的功能。如果您使用的是旧版本的 Unity,请更新它,否则您可能无法使用下面的解决方案。

    首先,使用SceneManager.LoadSceneAsync 加载场景。将allowSceneActivation 设置为false,这样加载后场景不会自动激活。

    您的问题的主要解决方案是SceneManager.MoveGameObjectToScene 函数,该函数用于将游戏对象从一个场景转移到另一个场景。加载场景后调用它,然后调用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!");
    }
    

    【讨论】:

    • 非常感谢!
    • @Programmer 我会将你的脚本附加到哪个游戏对象上,好吗?
    • @tmighty 你只需要将它附加到场景中任何处于活动状态的游戏对象上,因为它使用协程,必须启用游戏对象。一个空的 GameObject 很好。之后,将要移动到另一个场景的 GameOBject 从该 GameObject 上的脚本拖放到 UIRootObject 变量。那个 GameObject 是拖到 UIRootObject 插槽的东西,因为这就是我在代码中执行 SceneManager.MoveGameObjectToScene(UIRootObject, sceneToLoad); 时正在移动的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多