Unity - 使用 Android 设备后退按钮返回上一个场景
Unity - Back to last scene using Android Device Back Button
在 Unity 中,我设法通过单击设备 Android 后退按钮返回到最后一个场景,但问题是当我在第 3 个场景中并且我想返回到第 2 个场景,然后再返回到第一个场景。
从第3个场景到第2个场景,当我点击后退按钮时它成功了但是当我从第2个场景再次按下后退按钮到第一个场景时它没有。后退按钮似乎只在第一次使用。
这是我的 C# 代码:
public class SceneLoader : MonoBehaviour
{
private float seconds = 0.5f;
private static int lastScene;
private int currentScene;
private void Awake()
{
currentScene = SceneManager.GetActiveScene().buildIndex;
}
private void Update()
{
BackButtonPressed();
}
public void LoadNextScene(int numberOfSceneToLoad)
{
StartCoroutine(LoadScene(numberOfSceneToLoad));
}
private IEnumerator LoadScene(int numberOfScene)
{
currentScene = SceneManager.GetActiveScene().buildIndex;
SetLastScene(currentScene);
yield return new WaitForSeconds(seconds);
SceneManager.LoadScene(numberOfScene);
}
private void BackButtonPressed()
{
if (Input.GetKey(KeyCode.Escape))
{
Debug.Log("Current scene: " + currentScene);
Debug.Log("Last Scene (scene to load): " + GetLastScene());
SceneManager.LoadScene(GetLastScene());
currentScene = GetLastScene();
Debug.Log("Now the Current scene is: " + currentScene);
}
}
public static void SetLastScene(int currentSceneToLastScene)
{
lastScene = currentSceneToLastScene;
}
public static int GetLastScene()
{
return lastScene;
}
public void QuitGame()
{
Application.Quit();
}
}
提前致谢。
当您返回 BackToLastScene 时,您设置了 currentScene = GetLastScene();
但永远不会更改 lastScene
值。
我建议您使用某种后进先出数据结构,例如 System.Collections
中的 Stack
来跟踪场景。
这是一个示例伪代码:
define scene_stack;
function LoadNewScene(new_scene){
current_scene = GetCurrentScene();
scene_stack.Push(current_scene);
LoadScene(new_scene);
}
function LoadOldScene(){
old_scene = scene_stack.Pop();
LoadScene(old_scene);
}
在@Damiano 的帮助下,我像这样更改了我的代码并且它有效:
public class SceneLoader : MonoBehaviour
{
private float secondsToLoadNextScene = 0.5f;
private static int lastScene;
private int mainScene = 1;
private int currentScene;
public static Stack<int> sceneStack = new Stack<int>();
private void Awake()
{
currentScene = SceneManager.GetActiveScene().buildIndex;
}
private void Update()
{
BackButtonPressed();
}
public void LoadNextScene(int numberOfSceneToLoad)
{
StartCoroutine(LoadScene(numberOfSceneToLoad));
}
private IEnumerator LoadScene(int numberOfScene)
{
SetLastScene(currentScene);
yield return new WaitForSeconds(secondsToLoadNextScene);
LoadNewScene(numberOfScene);
}
public void BackButtonPressed()
{
if (Input.GetKey(KeyCode.Escape) && currentScene > mainScene)
{
if (lastScene == 0)
{
Debug.Log("Last scene was Splash Screen so load Main Scene instead.");
SceneManager.LoadScene(mainScene);
}
else
{
LoadLastScene();
}
}
}
public void LoadNewScene(int sceneToLoad)
{
currentScene = SceneManager.GetActiveScene().buildIndex;
sceneStack.Push(currentScene);
SceneManager.LoadScene(sceneToLoad);
}
public void LoadLastScene()
{
lastScene = sceneStack.Pop();
SceneManager.LoadScene(lastScene);
}
public static void SetLastScene(int makeCurrentSceneTheLastScene)
{
lastScene = makeCurrentSceneTheLastScene;
}
public static int GetLastScene()
{
return lastScene;
}
}
我花了很多时间搜索这个主题,所以我想出了这个实现,因为我发现大多数解决方案都很复杂。我来自原生 android 背景,所以我实现了原生 android 所做的事情,即使用堆栈来打开活动。当您在主屏幕中按后退按钮时,此代码也会退出应用程序。
public class navigation : MonoBehaviour
{
public static Stack<string> scenes = new Stack<string>();
void Start()
{
if (scenes.Count == 0)
{
scenes.Push(SceneManager.GetActiveScene().name);
}
}
void Update()
{
previousScene();
}
public void previousScene()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
if (scenes.Count == 1)
{
Application.Quit();
}
else
{
scenes.Pop();
string sceneToBuild = scenes.Pop();
loadScene (sceneToBuild);
}
}
}
public void loadScene(string newScene)
{
scenes.Push (newScene);
SceneManager.LoadScene (newScene);
}
}
这对我有用:
public class ChangeScene : MonoBehaviour
{
public static Stack<int> scenes = new Stack<int>();
int numScenes = scenes.Count;
public void loadScene(int newScene)
{
scenes.Push(newScene);
SceneManager.LoadScene(newScene);
}
public void previousScene()
{
if (numScenes != 0 && numScenes != 1)
{
scenes.Pop();
SceneManager.LoadScene(scenes.Peek());
}
else if (numScenes == 1)
{
//go back to main Scene
loadScene(0);
}
}
}
在 Unity 中,我设法通过单击设备 Android 后退按钮返回到最后一个场景,但问题是当我在第 3 个场景中并且我想返回到第 2 个场景,然后再返回到第一个场景。
从第3个场景到第2个场景,当我点击后退按钮时它成功了但是当我从第2个场景再次按下后退按钮到第一个场景时它没有。后退按钮似乎只在第一次使用。
这是我的 C# 代码:
public class SceneLoader : MonoBehaviour
{
private float seconds = 0.5f;
private static int lastScene;
private int currentScene;
private void Awake()
{
currentScene = SceneManager.GetActiveScene().buildIndex;
}
private void Update()
{
BackButtonPressed();
}
public void LoadNextScene(int numberOfSceneToLoad)
{
StartCoroutine(LoadScene(numberOfSceneToLoad));
}
private IEnumerator LoadScene(int numberOfScene)
{
currentScene = SceneManager.GetActiveScene().buildIndex;
SetLastScene(currentScene);
yield return new WaitForSeconds(seconds);
SceneManager.LoadScene(numberOfScene);
}
private void BackButtonPressed()
{
if (Input.GetKey(KeyCode.Escape))
{
Debug.Log("Current scene: " + currentScene);
Debug.Log("Last Scene (scene to load): " + GetLastScene());
SceneManager.LoadScene(GetLastScene());
currentScene = GetLastScene();
Debug.Log("Now the Current scene is: " + currentScene);
}
}
public static void SetLastScene(int currentSceneToLastScene)
{
lastScene = currentSceneToLastScene;
}
public static int GetLastScene()
{
return lastScene;
}
public void QuitGame()
{
Application.Quit();
}
}
提前致谢。
当您返回 BackToLastScene 时,您设置了 currentScene = GetLastScene();
但永远不会更改 lastScene
值。
我建议您使用某种后进先出数据结构,例如 System.Collections
中的 Stack
来跟踪场景。
这是一个示例伪代码:
define scene_stack;
function LoadNewScene(new_scene){
current_scene = GetCurrentScene();
scene_stack.Push(current_scene);
LoadScene(new_scene);
}
function LoadOldScene(){
old_scene = scene_stack.Pop();
LoadScene(old_scene);
}
在@Damiano 的帮助下,我像这样更改了我的代码并且它有效:
public class SceneLoader : MonoBehaviour
{
private float secondsToLoadNextScene = 0.5f;
private static int lastScene;
private int mainScene = 1;
private int currentScene;
public static Stack<int> sceneStack = new Stack<int>();
private void Awake()
{
currentScene = SceneManager.GetActiveScene().buildIndex;
}
private void Update()
{
BackButtonPressed();
}
public void LoadNextScene(int numberOfSceneToLoad)
{
StartCoroutine(LoadScene(numberOfSceneToLoad));
}
private IEnumerator LoadScene(int numberOfScene)
{
SetLastScene(currentScene);
yield return new WaitForSeconds(secondsToLoadNextScene);
LoadNewScene(numberOfScene);
}
public void BackButtonPressed()
{
if (Input.GetKey(KeyCode.Escape) && currentScene > mainScene)
{
if (lastScene == 0)
{
Debug.Log("Last scene was Splash Screen so load Main Scene instead.");
SceneManager.LoadScene(mainScene);
}
else
{
LoadLastScene();
}
}
}
public void LoadNewScene(int sceneToLoad)
{
currentScene = SceneManager.GetActiveScene().buildIndex;
sceneStack.Push(currentScene);
SceneManager.LoadScene(sceneToLoad);
}
public void LoadLastScene()
{
lastScene = sceneStack.Pop();
SceneManager.LoadScene(lastScene);
}
public static void SetLastScene(int makeCurrentSceneTheLastScene)
{
lastScene = makeCurrentSceneTheLastScene;
}
public static int GetLastScene()
{
return lastScene;
}
}
我花了很多时间搜索这个主题,所以我想出了这个实现,因为我发现大多数解决方案都很复杂。我来自原生 android 背景,所以我实现了原生 android 所做的事情,即使用堆栈来打开活动。当您在主屏幕中按后退按钮时,此代码也会退出应用程序。
public class navigation : MonoBehaviour
{
public static Stack<string> scenes = new Stack<string>();
void Start()
{
if (scenes.Count == 0)
{
scenes.Push(SceneManager.GetActiveScene().name);
}
}
void Update()
{
previousScene();
}
public void previousScene()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
if (scenes.Count == 1)
{
Application.Quit();
}
else
{
scenes.Pop();
string sceneToBuild = scenes.Pop();
loadScene (sceneToBuild);
}
}
}
public void loadScene(string newScene)
{
scenes.Push (newScene);
SceneManager.LoadScene (newScene);
}
}
这对我有用:
public class ChangeScene : MonoBehaviour
{
public static Stack<int> scenes = new Stack<int>();
int numScenes = scenes.Count;
public void loadScene(int newScene)
{
scenes.Push(newScene);
SceneManager.LoadScene(newScene);
}
public void previousScene()
{
if (numScenes != 0 && numScenes != 1)
{
scenes.Pop();
SceneManager.LoadScene(scenes.Peek());
}
else if (numScenes == 1)
{
//go back to main Scene
loadScene(0);
}
}
}