C# 我如何再次点击退出键返回游戏?

C# 我如何再次点击退出键返回游戏?,c#,unity3d,C#,Unity3d,现在,当按下escape键时,它将加载主菜单场景。 在主菜单中,我有新的游戏按钮,但没有继续 我希望在加载主菜单场景时再次按下escape键,它会返回到游戏的当前位置,而不是制作一个resume按钮。要么是在一个剪接场景中,要么就是在游戏中无所事事 因此,当再次按下退出键时,它将返回游戏并从最后一点继续 另一个子问题:我应该使用:LoadSceneMode.Additional吗?或者在游戏场景和主菜单之间切换时,应删除当前活动场景,然后加载下一个场景 using System.Collecti

现在,当按下escape键时,它将加载主菜单场景。 在主菜单中,我有新的游戏按钮,但没有继续

我希望在加载主菜单场景时再次按下escape键,它会返回到游戏的当前位置,而不是制作一个resume按钮。要么是在一个剪接场景中,要么就是在游戏中无所事事

因此,当再次按下退出键时,它将返回游戏并从最后一点继续

另一个子问题:我应该使用:LoadSceneMode.Additional吗?或者在游戏场景和主菜单之间切换时,应删除当前活动场景,然后加载下一个场景

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

public class BackToMainMenu : MonoBehaviour
{
    public PlayerCameraMouseLook cammouselook;

    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1);
            PlayerCameraMouseLook.mouseLookEnable = false;
            cammouselook.enabled = true;
        }
    }
}
主菜单场景位于索引0,游戏场景位于索引1

我尝试的是:

SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1, LoadSceneMode.Additive);
以及层次结构:

脚本被附加到回到主菜单gameobject。所有的游戏对象都在主游戏下

第一次按escape键时,它将加载到主菜单,并将主菜单场景加载到层次。第二次按escape键时,它会像新游戏一样重新开始游戏,并删除主菜单


在这两种情况下,游戏场景都保留在层次结构中。

我建议您添加带有您提到的标志
Additive
主菜单场景

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.SceneManagement;
公共类BacktoMinMenu:MonoBehavior
{
//变数
private bool\u isInMainMenu=false;
公共游戏CameramouseLook;
//每帧调用一次更新
无效更新()
{
if(Input.GetKeyDown(KeyCode.Escape))
{
如果(!\u是主菜单)
{
SceneManager.LoadScene(0,LoadSceneMode.Additional);
PlayerCameraMouseLook.mouseLookEnable=false;
cammouselook.enabled=true;
//--冻结游戏的代码
}
其他的
{
SceneManager.UnloadSceneAsync(0);
//--解冻游戏的代码
}
_isInMainMenu=!\u isInMainMenu;
}
}
}
查看变量
\u isInMainMenu
:它将跟踪您是否在主菜单中。根据该值,退出键的行为将有所不同

注意:我建议您在
LoadScene/UnloadSceneAsync
中键入场景的当前索引,除非您想更改它们的索引。在此场景中,键入场景名称(方法重载)

现在,我所说的“冻结游戏的代码”取决于您的游戏:

  • 您可以拥有一个包含场景中所有其他游戏对象的唯一游戏对象,并
    启用/禁用它
myBigGameObject.SetActive(true/*或false*/);
  • 在MonoBehavior中有一个逻辑,可以在主菜单中冻结游戏。 例如,您可以使用Update()中的bool
    \u isInMainMenu
    来阻止他们完成工作
例如,在我创建的这个MonoBehavior中,作为一个示例:

公共类示例MonoBehavior:MonoBehavior
{
私有无效更新()
{
如果(\u是主菜单)
返回;
打印(“我在跑步!”);
}
}
  • 拥有一个集合(以列表为例),用于存储每个
    顶级层次游戏对象
    ,并根据需要启用/禁用它们,以实现与上述相同的行为
根据您的代码,还有许多其他选项。 我强烈建议你做第一个或第三个选择,除非你有更好的方法

问题是,如果你想回到主菜单,它不应该太大(加载时间,内存使用,…),所以你可以从
主场景中禁用GameObject
(第三点),以便在你离开
主菜单时快速恢复它们,而不必重新加载整个场景。这将导致您使用序列化和反序列化



Edited:Typo

如果你能看一下我的问题,请看我用我迄今为止尝试过的方法编辑的。它不好用。第二次退出点击返回游戏,就像恢复一样,让它像新游戏一样开始游戏。我想我没做对。你认为PlayerCameraMouseLook.mouseLookEnable=false和cammouselook.enabled=true做什么?你解冻游戏的时候照顾过他们吗?如果任何Menobehavious拥有游戏解冻功能,请小心使用魔法方法
OnEnable()
。我发现在我的层次结构中,mainGame下有一个EventSystem。一旦我在运行游戏之前禁用了层次结构中的EventSystem对象,escape键现在就可以正常工作了。EventSystem通过我添加的画布或其他ui之一添加到层次结构中。这不是一个我自己添加的事件系统。所以也许我应该删除eventsystem对象?就是这个事件系统让游戏在第二个escape键上重新开始。当事件系统对象在运行游戏时被禁用时,它工作正常。我需要活动系统吗?下面是事件系统的屏幕截图:EventSystem组件将允许您的UI使用光线投射(例如,检测鼠标单击UI元素),甚至可以使用2D/3D物理元素的光线投射器。它不应该让你的代码失败。如果您不需要它(例如按钮将需要它),您可以安全地禁用它。奇怪的是,这个组件让你的代码失败了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class BackToMainMenu : MonoBehaviour
{
    // Variables
    private bool _isInMainMenu = false;
    public GameObject mainGame;
    public PlayerCameraMouseLook cammouselook;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (!_isInMainMenu)
            {
                SceneManager.LoadScene(0, LoadSceneMode.Additive);
                PlayerCameraMouseLook.mouseLookEnable = false;
                cammouselook.enabled = true;

                // -- Code to freeze the game
                mainGame.SetActive(false);
            }
            else
            {
                SceneManager.UnloadSceneAsync(0);
                // -- Code to unfreeze the game
                mainGame.SetActive(true);
            }

            _isInMainMenu = !_isInMainMenu;
        }
    }
}