Unity新输入系统替代Input.GetKeyDown()实现蹲伏的问题
问题解决:用InputAction完全替换蹲伏按键绑定
以下是具体的代码修改步骤,彻底移除旧的crouchKey,改用crouchAction实现正常的蹲伏/站立切换:
1. 删除旧按键绑定变量
移除类中[Header("Keybinds")]下的硬编码按键变量:
// 删掉这一行 public KeyCode crouchKey = KeyCode.LeftControl;
2. 添加蹲伏状态跟踪变量
在类的私有变量区新增一个变量,用来记录上一帧的蹲伏输入状态,解决持续输入导致的状态异常:
private bool wasCrouchingLastFrame; // 跟踪上一帧蹲伏输入状态
3. 初始化状态变量
在Start()方法末尾添加初始化代码:
wasCrouchingLastFrame = false;
4. 替换MyInput()中的蹲伏输入逻辑
删除原来基于Input.GetKeyDown/Up的代码,改用crouchAction的状态变化判断:
private void MyInput() { var jumpInput = jumpAction.ReadValue<float>(); var crouchInput = crouchAction.ReadValue<float>(); bool isCrouchingNow = crouchInput > 0; // 跳跃逻辑保持不变 if(jumpInput > 0 && readyToJump && grounded) { readyToJump = false; Jump(); Invoke(nameof(ResetJump), jumpCooldown); } // 蹲伏按下事件:当前输入激活且上一帧未激活 if (isCrouchingNow && !wasCrouchingLastFrame) { transform.localScale = new Vector3(transform.localScale.x, crouchYScale, transform.localScale.z); rb.AddForce(Vector3.down * 5f, ForceMode.Impulse); } // 蹲伏抬起事件:当前输入未激活且上一帧激活 if (!isCrouchingNow && wasCrouchingLastFrame) { transform.localScale = new Vector3(transform.localScale.x, startYScale, transform.localScale.z); } // 更新上一帧状态 wasCrouchingLastFrame = isCrouchingNow; }
5. 替换StateHandler()中的蹲伏状态判断
把原来基于Input.GetKey的判断改成用crouchAction的输入值:
private void StateHandler() { var sprintInput = sprintAction.ReadValue<float>(); var crouchInput = crouchAction.ReadValue<float>(); bool isCrouching = crouchInput > 0; // 改用crouchAction判断蹲伏状态 if (isCrouching) { state = MovementState.crouching; moveSpeed = crouchSpeed; } else if(grounded && sprintInput > 0) { state = MovementState.sprinting; moveSpeed = sprintSpeed; } else if (grounded) { state = MovementState.walking; moveSpeed = walkSpeed; } else { state = MovementState.air; } }
6. 优化跳跃时的蹲伏恢复(可选)
在Jump()方法中添加恢复站立的逻辑,避免玩家蹲伏跳跃后保持蹲伏缩放:
private void Jump() { exitingSlope = true; // 跳跃时强制恢复站立状态 transform.localScale = new Vector3(transform.localScale.x, startYScale, transform.localScale.z); wasCrouchingLastFrame = false; rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z); rb.AddForce(transform.up * jumpForce, ForceMode.Impulse); }
内容的提问来源于stack exchange,提问作者Awesome Guy
相关产品推荐
相关产品推荐

