Я показываю сцену инвентаря и делаю это с помощью 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!!");
}
}
}