如何计算按钮点击间隔?实现攻击动画结束后再响应下一次点击
解决方案
一、控制攻击触发时机(动画结束前不响应新点击)
你可以通过标记攻击状态+自动获取当前播放动画时长的方式实现,无需硬编码动画名称:
添加私有字段标记攻击状态:
private bool _isAttacking = false;:标记是否正在播放攻击动画
修改
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
相关产品推荐
相关产品推荐

