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

时间:2016-06-08 00:16:10

标签: c# unity3d

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

Unity 在场景之间保持关键状态。例如,让我们说我按住空格并跟踪单词" Hello"使用:

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

现在。让我们说我使用以下方法重置场景:

Application.LoadLevel(0);

SceneManager.LoadScene(0);

无论哪一个适合你。如果我重置了场景,但我仍然保持空间,在我抬起手指并再次放下它之前没有任何反应。当我构建我的2D Top Down游戏时,这是一个巨大的问题,因为我正在计划建筑物和内部物品是不同的场景。有没有人有任何想法?请不要建议

DontDestroyOnLoad

因为那不起作用。我试过了,你可以亲自尝试一下。我还缺少任何其他想法或技巧或其他东西?我在这里绝望。感谢。

我正在使用C#和Unity。

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

通过使用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);
}

答案 2 :(得分:0)

您是否尝试在主要级别以下的某处添加内部级别。不仅仅是在玩家离开建筑物之后将玩家移动到这一点,你可以卸载场景并将玩家移回原处。