限制按钮在几秒钟内按下?

时间:2017-12-27 02:48:53

标签: c# unity3d

如何让按键功能仅在#秒之间工作?例如,允许用户随时按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秒钟工作一次。所以,这并不是应该的。谁能帮我?有点迷失在这里。 谢谢!

2 个答案:

答案 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语句。