避免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菜单开始游戏按钮会导致两个或更多生命被扣除。
不需要锁,只需要一个布尔值来翻转每次点击,并且只有当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;
}
}
这主要用于多线程,但它应该为你做的工作。