You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:16:09