如何让按键功能仅在#秒之间工作?例如,允许用户随时按E,但每5秒执行一次动画?我尝试过Invoke,但似乎并没有像它应该的那样工作。我还试过了timestamp和StartCoroutine(waitforseconds)。
这是我得到的所以你可以看到:
void Update()
{
if (triggerIsOn && Input.GetKeyDown(KeyCode.E))
{
drinkAmin.Play("DrinkVodka");
StartCoroutine(letsWait());
}
}
和
IEnumerator letsWait(){
Debug.Log ("lets wait works!");
yield return new WaitForSeconds (5);
TakeAshot ();
}
这一切都有效,但不是间隔5秒钟,而是按下每个按钮后每5秒钟工作一次。所以,这并不是应该的。谁能帮我?有点迷失在这里。 谢谢!
答案 0 :(得分:0)
你所谈论的内容被称为“去抖动者”。关于这个问题已经有了很好的问题:C# event debounce - 尝试使用其中一种方法。
答案 1 :(得分:0)
我想出了一种通过在每个协程调用中使用协程和唯一标识符来消除Unity中输入事件的解决方案。
public class Behaviour : MonoBehaviour
{
private Guid Latest;
void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
// start the debounced input handler coroutine here
StartCoroutine(Debounced());
}
}
private IEnumerator Debounced()
{
// generate a new id and set it as the latest one
var guid = Guid.NewGuid();
Latest = guide;
// set the denounce duration here
yield return new WaitForSeconds(3);
// check if this call is still the latest one
if (Latest == guid)
{
// place your debounced input handler code here
}
}
}
此代码的作用是为每次Debounced
方法的调用生成唯一的ID,并设置最近一次Debounced
调用的ID。如果最新的呼叫ID与当前的呼叫ID相匹配,则执行代码。否则,在此之前发生了另一个调用,因此我们不会运行该代码。
Guid
类位于System
命名空间中,因此您需要在文件顶部using System;
上添加using语句。