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

如何用Unity新输入系统实现蹲站按钮切换?解决输入过快问题

问题原因

你遇到的问题核心是输入检测逻辑错误:crouch.IsPressed()会在按住按键的每帧都返回true。当你按下蹲伏键时,第一帧会触发Crouch()把isCrouching设为true;紧接着同一帧或下一帧,第二个if的条件crouch.IsPressed() && isCrouching就会满足,立刻执行Stand()把isCrouching又设回false,导致角色看起来“刚蹲下就站起来”。

另外你的Stand()方法还存在一个小问题:没有把角色位置恢复到原来的高度,长期切换会让角色位置越来越低。

修复方案

以下是几种可行的解决方式,按推荐程度排序:

方案1:新输入系统绑定单次触发事件(推荐)

如果使用Unity新输入系统,不要在Update/FixedUpdate里轮询输入,直接给蹲伏按钮绑定performed事件(只在按键按下的瞬间触发一次):

private void Awake()
{
    // 绑定蹲伏按键的单次触发事件
    crouch.performed += ctx => ToggleCrouch();
}

private void ToggleCrouch()
{
    isCrouching = !isCrouching;
    if (isCrouching)
    {
        // 蹲下逻辑
        transform.localScale = new Vector3(transform.localScale.x, 0.75f, transform.localScale.z);
        transform.position = new Vector3(transform.position.x, transform.position.y - 0.15f, transform.position.z);
    }
    else
    {
        // 站起逻辑(修正位置)
        transform.localScale = new Vector3(transform.localScale.x, 1f, transform.localScale.z);
        transform.position = new Vector3(transform.position.x, transform.position.y + 0.15f, transform.position.z);
    }
}

方案2:旧输入系统用GetKeyDown检测单次按下

如果使用旧输入系统,把持续检测的IsPressed()换成只检测按键按下瞬间的GetKeyDown():

private void Update()
{
    // 只在按键按下的那一帧触发
    if (Input.GetKeyDown(KeyCode.LeftControl)) // 替换成你的蹲伏按键
    {
        isCrouching = !isCrouching;
        if (isCrouching)
        {
            Crouch();
        }
        else
        {
            Stand();
        }
    }
}

// 修正Stand方法的位置恢复逻辑
private void Stand()
{
    transform.localScale = new Vector3(transform.localScale.x, 1f, transform.localScale.z);
    transform.position = new Vector3(transform.position.x, transform.position.y + 0.15f, transform.position.z);
    isCrouching = false;
}

方案3:用标志位防止重复触发(应急方案)

如果一定要保留IsPressed()的检测方式,可以加一个标志位,确保每次按键按下只触发一次切换:

private bool hasHandledCrouch = false;

private void Update()
{
    if (crouch.IsPressed())
    {
        if (!hasHandledCrouch)
        {
            hasHandledCrouch = true;
            isCrouching = !isCrouching;
            if (isCrouching) Crouch();
            else Stand();
        }
    }
    else
    {
        // 松开按键后重置标志位,允许下次触发
        hasHandledCrouch = false;
    }
}

// 记得修正Stand方法的位置逻辑
private void Stand()
{
    transform.localScale = new Vector3(transform.localScale.x, 1f, transform.localScale.z);
    transform.position = new Vector3(transform.position.x, transform.position.y + 0.15f, transform.position.z);
    isCrouching = false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:20:31