避免UI按钮在快速点击后运行两次功能

本文关键字:运行 功能 两次 按钮 UI 避免 | 更新日期: 2023-09-27 18:02:23

如何避免我的UI按钮运行功能两次,如果点击(意外)两次或更多在短时间内?

我有一个UI按钮调用StartGame函数在我的游戏脚本。我将脚本附加到检查器中的按钮上。该函数设置了一些变量,以便游戏开始。

如果我不小心快速地点击了两次按钮,start函数就会执行两次,这样它就把变量搞砸了。我该如何避免呢?

我正在考虑拆分函数,以便它检查是否已经启动,但这似乎有点复杂。Unity UI中是否存在标准设置或某些我遗漏的标准代码?试着用谷歌搜索,但运气不好。

我的代码的简化示例:

public void StartGame() {
MenuAnimator.SetBool ("Startbutton", false); // animates my start game panel off the screen.
lives = lives - 1;
Do Rest of Code();
}

在这种情况下,多次点击UI菜单开始游戏按钮会导致两个或更多生命被扣除。

避免UI按钮在快速点击后运行两次功能

不需要锁,只需要一个布尔值来翻转每次点击,并且只有当bool值为true时按钮才会触发响应。

第一次点击-> true ->响应。

第二次点击-> false ->返回

这样怎么样?这将防止在1秒内发生双击(或者你想要的次数)

bool buttonLocked;
System.Timers.Timer t = new System.Timers.Timer(1000); //however many milliseconds
t.Elapsed += new EventHandler(resetFlag);
private void button_clicked(object sender, EventArgs e){
    if(!buttonLocked){
       // Handle Click
       buttonLocked= true;
       t.Enabled = true;
    }
}
private void resetFlag(){
    buttonLocked = false;
    t.Enabled = false;
}

或者你可能只是使用是否启用定时器作为一个标志,假设定时器已正确初始化。我喜欢有一个单独的标志,但可读性。

完全披露——我正在酒吧用手机打字,所以它还没有经过测试,但我认为应该可以工作

由于我无法评论,以下是我的答案。你可以锁定变量

首先创建一个锁

private readonly object _locker = new object();

在你的锁属性中设置/获取

get { lock (_locker) { return this.myVar; } }
set { lock (_locker) { this.myVar = value; } }

现在你可以使用

来锁定MyVar变量
public void MethodA()
{
    lock(_locker)
    {
        if(myVar == 1)
          myVar = 0;
    }
}

这主要用于多线程,但它应该为你做的工作。