C# 如何清除unity c中的所有用户击键?

C# 如何清除unity c中的所有用户击键?,c#,unity3d,yield-return,C#,Unity3d,Yield Return,我正在开发的Unity游戏中编写一些c代码。 还有一个问题我无法解决 我在我的代码中使用Start例程,在代码中我调用另一个Start例程。我知道这样做时,有两个线程在这些部分执行代码。 但如果我把收益率称为回归StartRotuine的话就不会了 IEnumerator StartLoop() { yield return StartCorotuine(GetInputFromUser()); // 1 // some variables yield return St

我正在开发的Unity游戏中编写一些c代码。 还有一个问题我无法解决

我在我的代码中使用Start例程,在代码中我调用另一个Start例程。我知道这样做时,有两个线程在这些部分执行代码。 但如果我把收益率称为回归StartRotuine的话就不会了

IEnumerator StartLoop()
{
    yield return StartCorotuine(GetInputFromUser()); // 1
    // some variables
    yield return StartCorotuine(GetInputFromUser()); // 2
}

IEnumerator GetInputFromUser()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
         print("IN");
    }
    else
    {
         yield return null;
    }

}
问题是,它打印了两次。 从第一次调用“GetInputFromUser()”开始,缓冲区就不是空的,它会一直保留到第二次,并立即进入if,即使我没有按空格键

我尝试过的事情:

Console.Clear();
Console.ReadKey();
Console.ReadLine();
UnityEngine.Rendering.CommandBuffer.Clear();
while(Console.KeyAvailable)
    Console.ReadKey();
还有一些我都不记得了

要么整个想法都是错误的,不知何故,它一直有效到现在。或者我错过了什么

有什么建议吗?我已经用谷歌搜索了我能想到的一切

[[已解决]]] 我不知道它在这里是怎么工作的,如果你要关闭帖子或其他什么的话。但我已经解决了

问题是,正如有人所说,调用发生在同一帧中,因此我在两者之间添加了另一个空值,以强制跳到下一帧:

IEnumerator StartLoop()
{
    yield return StartCorotuine(GetInputFromUser()); // 1
    // some variables

    yield return null;   // skipping frame


    yield return StartCorotuine(GetInputFromUser()); // 2
}

IEnumerator GetInputFromUser()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
         print("IN");
    }
    else
    {
         yield return null;
    }

}

谢谢你的帮助

首先:协同程序与线程无关!每个协同程序都在Unity主线程中执行,并在该行为的
Update
完成后立即执行它们的
MoveNext


你的问题应该是

IEnumerator GetInputFromUser()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
         print("IN");
    }
    else
    {
         yield return null;
    }
}
在没有输入的情况下,
yield返回null导致协同路由至少等待一帧

因此,第二个将在下一帧中执行

但是如果有输入,请等待而不是等待,这样下一个协同程序将直接在您不等待的地方启动

结果:您无需等待即可获得两次
打印


现在还不完全清楚您在这里尝试的是什么,但我假设您希望等到按下
空格
,所以您应该使用例如

bool GetInputFromUser()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
         print("IN");
         return true
    }

    return false;
}
像这样使用它

// This now waits until the user presses Space
yield return new WaitUntil (GetInputFromUser);
或者也可以简单地对一帧进行
yield
,以防出现类似的输入

IEnumerator GetInputFromUser()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
         print("IN");
    }

    yield return null;
}
虽然

目标是检查用户是否多次按下空格键

用户不太可能在两个连续帧中按下两次键


startoop
在内部启动
Start()

但是现在用户还不能提供任何输入。因此,如果用户在开始()的前几帧内按了一个键,则只需检查一次。

我在等待第一次太空划船。 一旦他成功了,我就开始
startRotuine(startOOP())抱歉弄错了

我这样使用它,也许会更清楚,一旦用户开始循环,我就等他按空格键。一旦他有一个定时器被设置为on,并且一旦定时器对IEnumerator返回进行了计时,没有用户的输入,我就进入下一个迭代,我唯一想做的就是检查用户是否在该空间上按了两次

{
    while (timer < timeSetInStart)
    {
         If(Input.GetKeyDown(KeyCode.Space))
         {    
             print("IN";
             yield break;
         }
         else
         {
             yield return null;
         }
    }
}
{
while(定时器
我不确定是否有特定的原因需要在协同程序中执行此操作,但在
更新()中处理此操作可能更容易:


你能添加更多的上下文吗?你的目标是什么?startoop
从哪里开始?是的,目标是检查用户是否多次按下空格键。我检查他是否在一个时间限制内第一次按下空格键,然后检查他是否再次按下。
startoop
Start()内部开始
Coroutibed不是线程。你可以跳过一个corroutine中的
startcroutin
,只产生另一个方法。我刚刚尝试了你建议的bool方法,但失败了。它延迟了所有程序。但可能它只适用于我现在尝试的多重检查。我刚刚尝试了bool方法,只适用于多重检查ple检查后,它仍然在
if(Input.GetKeyDown(KeyCode.Space))的内部
,所以它似乎是缓冲区problem@barelh
GetKeyDown
在第一帧时返回true,一个键被按下,直到下一帧才重置。有一个缓存,因为这是Unity的输入管理器的全部功能。@barelh我假设当你尝试bool方法时,你有两个
WaitUntil()
背对背调用?如果你想让它工作,你需要在它们之间添加一个
yield return null
bool spacePressed = false;
void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (spacePressed)
        {
            print("Space pressed twice");
            spacePressed = false;
        }
        else
        {
            print("Space pressed once");
            spacePressed = true;
        }
    }
}