SceneManager не активирует мою предыдущую сцену - PullRequest
0 голосов
/ 30 ноября 2018

Я показываю сцену инвентаря и делаю это с помощью AddScene Additive.Я перевожу плеер на эту новую сцену.

Это тоже отлично работает.Перед тем, как загрузить новую сцену, я сохраняю ссылку на текущую активную сцену, например:

private Scene PrevScene;

PrevScene = SceneManager.GetActiveScene();

Теперь, когда игрок выходит из сцены инвентаря, нажав клавишу, я подумал, что могу просто установить предыдущую сценучтобы снова быть активной сценой, например:

SceneManager.MoveGameObjectToScene(UIRootObject, PrevScene); //transfer the player to the new scene
SceneManager.SetActiveScene(PrevScene);

Однако предыдущая сцена не загружается.Вместо этого сцена инвентаря становится все ярче и ярче, поэтому я думаю, что загружаю сцену инвентаря снова и снова.

Есть ли что-то принципиально неправильное в моем подходе или требуется больше кода, чтобы увидеть, что я делаю неправильно?

Если да, я изложил весь код ниже:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

//First, load scene with SceneManager.LoadSceneAsync.Set allowSceneActivation to false so that the scene won't activate automatically after loading.

public class PlayerScript : MonoBehaviour
{
public GameObject UIRootObject;
private bool _bInventoryShown = false;
private Scene PrevScene;

void Update()
{
    if (Input.GetKeyDown(KeyCode.I))
    {

        Debug.Log("Is inventory currently shown: " + _bInventoryShown);

        //player pressed I to show the inventory
        if (!_bInventoryShown)
        {
            //store the currently active scene
            PrevScene = SceneManager.GetActiveScene();

            //start loading the inventory scene
            StartCoroutine(loadScene("inventory"));
        }
        else
        {
            //player pressed I again to hide the inventory scene
            //so just set the previous scene as the active scene
            SceneManager.MoveGameObjectToScene(UIRootObject, PrevScene); //transfer the player to the new scene
            SceneManager.SetActiveScene(PrevScene);
        }

        _bInventoryShown = !_bInventoryShown;
    }
}
IEnumerator loadScene(string SceneName)
{
    AsyncOperation nScene = SceneManager.LoadSceneAsync(SceneName, LoadSceneMode.Additive);
    nScene.allowSceneActivation = false;

    while (nScene.progress < 0.9f)
    {
        Debug.Log("Loading scene " + " [][] Progress: " + nScene.progress);
        yield return null;
    }

    //Activate the Scene
    nScene.allowSceneActivation = true;

    while (!nScene.isDone)
    {
        // wait until it is really finished
        yield return null;
    }

    Scene nThisScene = SceneManager.GetSceneByName(SceneName);

    if (nThisScene.IsValid())
    {
        Debug.Log("Scene is Valid");
        SceneManager.MoveGameObjectToScene(UIRootObject, nThisScene); //transfer the player to the new scene
        SceneManager.SetActiveScene(nThisScene); //activate the scene
    }
    else
    {
        Debug.Log("Invalid scene!!");
    }
}
}

1 Ответ

0 голосов
/ 30 ноября 2018

Понял: мне нужно вызвать SceneManager.Unload (SceneName).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...