Unity中如何实现按钮每2秒仅可点击一次的冷却功能
Unity按钮点击冷却(每2秒可点击一次)实现方案
问题分析
你的代码失效的核心原因是:启动协程后立刻执行了_buttonDiggingGrave.SetActive(true);,协程里的隐藏操作被主线程的显示操作直接覆盖,而且没有任何判断阻止冷却期间的重复点击。
修正方案(两种可选)
方案1:用布尔标记+协程控制按钮显示/隐藏
添加一个布尔变量标记是否允许点击,点击后立刻禁用标记,协程冷却结束后再恢复:
public class DiggingGrave : MonoBehaviour { private int _RundomNumberBone, _Chance; public GameObject _buttonNewArtefact, _buttonDiggingGrave; // 控制是否允许点击的标记 private bool _canDig = true; // 可自定义的冷却时间 public float cooldownTime = 2f; private void Start() { } public void Digging() { // 冷却期间直接返回,不执行挖墓逻辑 if (!_canDig) return; // 标记为冷却中,隐藏按钮 _canDig = false; _buttonDiggingGrave.SetActive(false); // 执行挖墓核心逻辑 _Chance = Random.Range(1, 100); Debug.Log(_Chance); if (BuyItemUndertaker.i == 1)// Статы деревянной лопаты (60%-кость(2-6 костей);40%-ничего) { if (_Chance > 40) { _RundomNumberBone = Random.Range(2, 6); ScoreCandy._ScoreBone += _RundomNumberBone; } } if(BuyItemUndertaker.i == 2)//Статы костяной лопаты (65%-кость(4-8 костей); 10%-душа(1); 25%-ничего) { if (_Chance > 35) { _RundomNumberBone = Random.Range(4, 8); ScoreCandy._ScoreBone += _RundomNumberBone; } if (_Chance <= 10) { ScoreCandy._ScoreSoul++; } } if (BuyItemUndertaker.i == 3)//Статы железной лопаты (70%-кость(8-16 костей); 15%-душа(2); 1%-новый артефакт;14%-ничего) { if (_Chance > 30) { _RundomNumberBone = Random.Range(8, 16); ScoreCandy._ScoreBone += _RundomNumberBone; } if (_Chance <= 15) { ScoreCandy._ScoreSoul = ScoreCandy._ScoreSoul +2; } if (_Chance == 16) { _buttonNewArtefact.SetActive(true); } } if (BuyItemUndertaker.i == 4)//Статы золотой лопаты (70%-кость(18-22 костей); 25%-душа(3); 1%-новый артефакт;4%-ничего) { if (_Chance > 30) { _RundomNumberBone = Random.Range(18, 22); ScoreCandy._ScoreBone += _RundomNumberBone; } if (_Chance <= 25) { ScoreCandy._ScoreSoul = ScoreCandy._ScoreSoul + 3; } if (_Chance == 26) { _buttonNewArtefact.SetActive(true); } } if (BuyItemUndertaker.i == 5)//Статы магической лопаты (70%-кость(26-34 костей); 29%-душа(4); 1%-новый артефакт;) { if (_Chance > 30) { _RundomNumberBone = Random.Range(26, 34); ScoreCandy._ScoreBone += _RundomNumberBone; } if (_Chance <= 29) { ScoreCandy._ScoreSoul = ScoreCandy._ScoreSoul + 4; } if (_Chance == 30) { _buttonNewArtefact.SetActive(true); } } // 启动冷却协程 StartCoroutine(DigCooldown()); } IEnumerator DigCooldown() { // 等待设定的冷却时间 yield return new WaitForSeconds(cooldownTime); // 冷却结束,恢复点击权限与按钮显示 _canDig = true; _buttonDiggingGrave.SetActive(true); } }
方案2:用Button组件的interactable属性(推荐)
相比隐藏按钮,禁用按钮的交互性体验更自然(按钮可见但变灰不可点击),只需直接引用Button组件修改属性:
public class DiggingGrave : MonoBehaviour { private int _RundomNumberBone, _Chance; public GameObject _buttonNewArtefact; // 直接引用Button组件而非GameObject public Button _buttonDiggingGrave; private bool _canDig = true; public float cooldownTime = 2f; private void Start() { // 确保初始状态按钮可交互 _buttonDiggingGrave.interactable = true; } public void Digging() { if (!_canDig) return; _canDig = false; _buttonDiggingGrave.interactable = false; // 以下是原有的挖墓逻辑,与方案1一致 _Chance = Random.Range(1, 100); Debug.Log(_Chance); // ...(此处保留你原有的所有条件判断代码) StartCoroutine(DigCooldown()); } IEnumerator DigCooldown() { yield return new WaitForSeconds(cooldownTime); _canDig = true; _buttonDiggingGrave.interactable = true; } }
关键改动说明
- 添加
_canDig布尔变量:从根源上阻止冷却期间的重复点击,即使按钮状态被意外修改,也不会触发挖墓逻辑 - 调整协程执行顺序:先完成挖墓逻辑,再启动冷却协程,避免主线程覆盖协程的状态修改
- 方案2使用
interactable:避免按钮频繁消失/出现的突兀感,更符合常规UI交互习惯
内容的提问来源于stack exchange,提问作者Micoto
相关产品推荐
相关产品推荐

