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

如何计算按钮点击间隔?实现攻击动画结束后再响应下一次点击

解决方案

一、控制攻击触发时机(动画结束前不响应新点击)

你可以通过标记攻击状态+自动获取当前播放动画时长的方式实现,无需硬编码动画名称:

  1. 添加私有字段标记攻击状态:

    • private bool _isAttacking = false;:标记是否正在播放攻击动画
  2. 修改OnAttack方法,先判断攻击状态再执行逻辑;播放动画后自动获取当前动画时长,用协程等待动画结束后重置状态:

private float _lastAttackTime;
private bool _isAttacking = false;

public void OnAttack(InputAction.CallbackContext context)
{
    // 正在攻击时直接拦截新点击
    if (_isAttacking) return;

    // 计算两次点击时间间隔
    float clickInterval = Time.time - _lastAttackTime;
    _lastAttackTime = Time.time;
    // 可根据需求使用该间隔值,比如打印调试
    // Debug.Log($"两次点击间隔:{clickInterval:F2}秒");

    var crit = Random.Range(0.0F, 101.0F);
    
    if (crit <= _heroConfig.CrintChance)
    {
        _animController.PlayAnimation(_animator, "Attack02");
    }
    else
    {
        _animController.PlayAnimation(_animator, "Attack01");
    }

    _isAttacking = true;
    StartCoroutine(WaitForAttackAnimationEnd());
}

private IEnumerator WaitForAttackAnimationEnd()
{
    // 等待一帧让Animator切换到目标动画状态
    yield return null;
    AnimatorStateInfo currentState = _animator.GetCurrentAnimatorStateInfo(0); // 假设动画在第0层
    // 根据动画速度计算实际播放时长
    yield return new WaitForSeconds(currentState.length / _animator.speed);
    _isAttacking = false;
}

另一种更精准的方式是使用动画事件:

  • 在"Attack01"和"Attack02"动画的最后一帧添加事件,调用以下方法重置状态:
public void OnAttackAnimationEnd()
{
    _isAttacking = false;
}

这种方式完全由动画帧控制,无需手动计算时长,适配动画速度变化的场景。

二、计算按钮两次点击的时间间隔

只需维护一个记录上次点击时间的字段_lastAttackTime,每次点击时用当前游戏时间Time.time减去该字段值,即可得到两次点击的时间间隔,之后更新该字段为当前时间即可。

注意:第一次点击时_lastAttackTime初始值为0,计算出的间隔会是当前游戏运行总时长,可根据需求判断是否跳过第一次的间隔计算。

内容的提问来源于stack exchange,提问作者Nikolay Stuff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:23:19