Unity中isAttacking布尔值无法自动置false,攻击动画异常求助
问题原因与解决办法
1. 动画事件未正确触发(核心问题)
你写的endAtack方法(注意拼写错误)负责将isAttacking设为false,但这个方法必须通过攻击动画的最后一帧添加的动画事件来调用,否则动画结束后不会自动执行它:
- 打开攻击动画剪辑,在时间轴的最后一帧添加动画事件,选择Player对象后,指定调用
PlayerController2D中的endAtack方法。 - 额外注意:方法名拼写错误——
endAtack应为endAttack,如果动画事件里填写的是正确拼写的endAttack,当前方法根本不会被触发,导致isAttacking永远保持true。
2. 直接用animator.Play()破坏状态机逻辑
代码中通过animator.Play("Player1_idle")、animator.Play("Player1_run")、animator.Play("Player1_jump")强制切换动画的方式,会完全绕过Animator状态机的参数判断:
- 触发攻击后,只要松开A/D键,代码就会执行else分支的
animator.Play("Player1_idle"),直接打断攻击动画,导致攻击与Idle循环切换。 - 触发Jump时调用
animator.Play("Player1_jump"),同样直接打断攻击动画,所以攻击会停止。
修正方案:改用Animator参数控制状态切换
- 在Animator窗口为状态机添加参数:
isRunning(布尔)、isJumping(布尔)、isAttacking(布尔)。 - 配置状态过渡条件:比如Idle→Run的条件为
isRunning=true,Run→Idle为isRunning=false;Idle/Run→Attack为isAttacking=true,Attack→Idle/Run为isAttacking=false且对应isRunning状态;Idle/Run→Jump为isJumping=true等。 - 修改代码逻辑,替换直接
Play的写法:
// 替换原A/D按键逻辑 float horizontalInput = Input.GetAxisRaw("Horizontal"); rb2d.velocity = new Vector2(horizontalInput * runSpeed, rb2d.velocity.y); animator.SetBool("isRunning", Mathf.Abs(horizontalInput) > 0 && isGrounded); if (horizontalInput > 0) spriteRenderer.flipX = false; else if (horizontalInput < 0) spriteRenderer.flipX = true; // 替换原Jump逻辑 if (Input.GetKeyDown("w") && isGrounded) { rb2d.velocity = new Vector2(rb2d.velocity.x, jumpSpeed); animator.SetBool("isJumping", true); } // 落地时重置跳跃状态 if (isGrounded && rb2d.velocity.y <= 0) { animator.SetBool("isJumping", false); }
3. 输入检测时机错误
你把攻击的Input.GetKeyDown("r")放在FixedUpdate中,FixedUpdate是固定时间间隔执行的,可能会错过单次按键输入。建议将所有输入检测逻辑移到Update方法中,因为Update每帧执行,更适合处理输入事件。
内容的提问来源于stack exchange,提问作者zeebebopo
相关产品推荐
相关产品推荐

