Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity-使用Android设备返回按钮返回到最后一个场景_Android_Unity3d_Back_Scene - Fatal编程技术网

Unity-使用Android设备返回按钮返回到最后一个场景

Unity-使用Android设备返回按钮返回到最后一个场景,android,unity3d,back,scene,Android,Unity3d,Back,Scene,在Unity中,我通过单击设备Android后退按钮返回到最后一个场景,但问题是当我在第三个场景中时,我想返回第二个场景,然后再返回第一个场景 从第三个场景到第二个场景,当我单击“后退”按钮时,它会成功运行,但当我再次从第二个场景到第一个场景按下“后退”按钮时,它不会运行。“后退”按钮似乎只在第一次起作用 这是我的c#代码: 提前感谢。当您返回到最后一个场景时,您设置了currentsecene=getlastsecene()但从不更改lastsecene值 我建议您使用某种后进先出数据结构,如

在Unity中,我通过单击设备Android后退按钮返回到最后一个场景,但问题是当我在第三个场景中时,我想返回第二个场景,然后再返回第一个场景

从第三个场景到第二个场景,当我单击“后退”按钮时,它会成功运行,但当我再次从第二个场景到第一个场景按下“后退”按钮时,它不会运行。“后退”按钮似乎只在第一次起作用

这是我的c#代码:


提前感谢。

当您返回到最后一个场景时,您设置了
currentsecene=getlastsecene()但从不更改
lastsecene

我建议您使用某种后进先出数据结构,如
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;
    }    

}
公共类场景阅读器:单行为
{
私有浮点数第二次加载NEXTSCENE=0.5f;
私人静态场景;
私有int主场景=1;
私人场所;
公共静态堆栈sceneStack=新堆栈();
私人空间
{
currentScene=SceneManager.GetActiveScene().buildIndex;
}
私有void更新()
{
BackButtonPressed();
}
公共void LoadNextScene(int numberOfSceneToLoad)
{
start例程(加载场景(numberOfSceneToLoad));
}
私有IEnumerator加载场景(int numberOfScene)
{
SetLastScene(当前场景);
返回新的WaitForSeconds(secondsToLoadNextScene);
LoadNewScene(numberOfScene);
}
public void BackButtonPressed()
{
if(Input.GetKey(KeyCode.Escape)和¤tsecene>mainsecene)
{
如果(lastScene==0)
{
Log(“最后一个场景是启动屏幕,所以加载主场景。”);
场景管理器。加载场景(主场景);
}
其他的
{
LoadLastScene();
}         
}
}
公共void LoadNewScene(int sceneToLoad)
{
currentScene=SceneManager.GetActiveScene().buildIndex;
sceneStack.Push(当前场景);
SceneManager.LoadScene(sceneToLoad);
}
公共void LoadLastScene()
{
lastsecene=sceneStack.Pop();
场景管理器。加载场景(lastScene);
}
公共静态无效SetLastScene(int makeCurrentSceneTheLastScene)
{
lastScene=MakeCurrentSceneLastScene;
}
公共静态int GetLastScene()
{
返回最后一个场景;
}    
}

我花了很多时间搜索这个主题,所以我提出了这个实现,因为我发现大多数解决方案都很复杂。我来自原生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);
    }
}
公共类导航:单一行为
{
公共静态堆栈场景=新堆栈();
void Start()
{
如果(scenes.Count==0)
{
scenes.Push(SceneManager.GetActiveScene().name);
}
}
无效更新()
{
前一场景();
}
公共场所
{
if(Input.GetKeyDown(KeyCode.Escape))
{
如果(scenes.Count==1)
{
Application.Quit();
}
其他的
{
scenes.Pop();
字符串sceneToBuild=scenes.Pop();
加载场景(场景构建);
}
}
}
公共void加载场景(字符串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);
    }
  }
}
公共类变更场景:单一行为
{
公共静态堆栈场景=新堆栈();
int numcenes=scenes.Count;
公共void加载场景(int newScene)
{
场景.推送(新闻场景);
场景管理器。加载场景(新闻场景);
}
公共场所
{
if(numcenes!=0&&numcenes!=1)
{
scenes.Pop();
加载场景(scenes.Peek());
}
else if(numcenes==1)
{
//回到主场景
加载场景(0);
}
}
}

谢谢你的回答,达米亚诺。加载场景后,我使用了lastScene-=lastScene inside BackButtonPressed(),它似乎可以工作,但需要更多的测试。请记住,只要不必跳过场景并始终逐个遍历它们,递减场景就可以工作。堆栈方法在这方面更加可靠,因为它允许您从其id加载最后一个场景重新命名。如果应用程序不需要它,仍然不需要它。(对不起,我的英语不好)是的,你说得对。对于我当前的游戏,我只需要返回主屏幕,而不跳过“重要场景”,但我认为如果你需要遵循你遵循的确切路径,你的方法会更好。我使用了这个脚本,并在第一个场景中将其放入了一个游戏对象中。我应该如何从其他脚本加载其他场景?
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);
    }
  }
}