C# 如何清除unity c中的所有用户击键?
我正在开发的Unity游戏中编写一些c代码。 还有一个问题我无法解决 我在我的代码中使用Start例程,在代码中我调用另一个Start例程。我知道这样做时,有两个线程在这些部分执行代码。 但如果我把收益率称为回归StartRotuine的话就不会了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
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@barelhGetKeyDown
在第一帧时返回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;
}
}
}