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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:35:24