【问题标题】:Unity doesn't keep keystates between scenesUnity 不会在场景之间保留键状态
【发布时间】:2016-06-10 13:41:01
【问题描述】:

我之前已经问过这个问题,我以为我得到了答案,但它对我没有用。所以,又来了。

Unity 在场景之间保持键状态。例如,假设我按住空格键并使用以下命令跟踪单词“Hello”:

Input.GetKey(KeyCode.Space)){
        print("Hello!");
}

现在。假设我使用以下方法重置场景:

Application.LoadLevel(0);

SceneManager.LoadScene(0);

哪一个适合你。如果我重置了场景,但我仍然保持空间,直到我抬起手指并再次放下它之前什么都不会发生。当我构建 2D Top Down 游戏时,这是一个巨大的问题,因为我计划让建筑物和内部的东西成为不同的场景。有没有人有任何想法?请不要推荐

DontDestroyOnLoad

因为那行不通。我试过了,你可以自己试试。还有其他想法或技巧或我缺少的东西吗?我在这里很绝望。谢谢。

我正在使用 C# 和 Unity。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    Unity 不会在场景之间保留键状态

    这部分是不正确的。当加载新场景时,Unity 的 Input.GetKey(KeyCode.Space) 将在 第一帧 中返回 false。这只发生在第一帧。之后,如果空格键仍然向下,它将继续返回true。本声明基于 Unity 5.4.0b13。如果您看到不同的结果,则必须更新。

    解决方案是将您的Input.GetKey(KeyCode.Space) 放入coroutine,然后在检查按键之前使用yield return null; 等待一帧。

    void Start()
    {
        StartCoroutine(readKey());
    }
    
    bool keepReading = false;
    IEnumerator readKey()
    {
        if (keepReading)
        {
            yield break;
        }
        keepReading = true;
    
        yield return null;
    
        while (keepReading)
        {
            if (Input.GetKey(KeyCode.Space))
            {
                Debug.Log("Hello!");
            }
            else
            {
                Debug.Log("Not down!");
            }
            yield return null;
        }
    }
    
    void stopReading()
    {
        keepReading = false;
    }
    

    另一种选择是使用布尔变量来确定何时进入下一帧。

    bool afterFirstFrame = false;
    void Update()
    {
        if (afterFirstFrame)
        {
            //Put your code here
    
            if (Input.GetKey(KeyCode.Space))
            {
                Debug.Log("Hello!");
            }
            else
            {
                Debug.Log("Not down!");
            }
        }
    
        if (!afterFirstFrame)
        {
            afterFirstFrame = true;
        }
    }
    

    【讨论】:

    • 我在 5.3。我想这可能是一个原因。谢谢,在我标记你之前给我一点时间检查一下。
    • @GMR516 在更新之前尝试我的代码。如果您仍然有问题,请将 Unity 更新到我的版本。我对其进行了测试以验证。
    • 我在最新版本 (5.4) 上测试了这两个代码,但仍然无法正常工作。
    • 我不确定现在的问题是什么,可能是我的键盘或奇怪的东西。如果它对你有用,我不知道出了什么问题。
    • @GMR516 我的两个答案都对我有用。您是否修改了我答案中的代码?如果是这样,请更新您在答案中的当前代码,我会查看它。如果您想查看我的测试代码以显示它有效,我可以将其链接到此处,以便您自己进行测试。如果您对 ejsd1989 的回答满意,可以接受。
    【解决方案2】:

    以下可能不是最干净的方法,但它适用于一些粗略的测试。

    通过使用 PlayerPrefs,您可以存储状态表示并在新加载场景的 Start() 函数中对其进行测试。

    它将创建的功能是,如果用户在切换场景之前持有它,它将验证第一帧是否为真。只有当用户允许释放按钮时,它才会停止验证 true。

    再一次,这是一种强制操作的实现,但需要对其进行定制以确保它在其他情况下也能正常运行。

    private bool isPressed = false;
    
    void Start()
    {
        if (PlayerPrefs.GetInt("Pressed") != 0)
            isPressed = true;
        else
            isPressed = false;
    }
    
    void Update()
    {
        if (isPressed)
            print("Hello World");
    
        if (Input.GetKey(KeyCode.Space))
        {
            if (!isPressed) isPressed = true;
        }
    
        if (Input.GetKeyUp(KeyCode.Space))
        {
            isPressed = false;
        }
    }
    
    public void SaveButtonState()
    {
        if(isPressed)
            PlayerPrefs.SetInt("Pressed", 1);
        else
            PlayerPrefs.SetInt("Pressed", 0);
    }
    

    【讨论】:

    • 它可以工作,但它有点hacky。显然,unity 5.4 在那里添加了在场景之间按住按钮的功能,所以我要去看看。如果还是不行,我会把你标记为答案。
    • @GMR516 确实有点 hacky 哈哈。无论哪种方式,都希望它以最适合您的应用程序的方式运行!
    【解决方案3】:

    您是否尝试过将内部关卡附加地加载到主关卡下方的某个位置。不仅仅是在玩家离开建筑后将玩家移动到这一点,您卸载场景并将玩家移回他所在的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多