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

Unity C#实现JumpKing式跳跃时GetKeyUp()检测异常排查

Unity 类Jump King斜跳交替异常修复

问题根因

  • 输入检测时序错误:Input.GetKeyUp("space")的触发判断被完全包裹在地面检测的if (RevisarSuelo.estaEnElSuelo)代码块内,角色空中阶段松开空格时,跳跃逻辑不会执行,触发事件会延迟到落地帧处理。而落地帧第一行代码会直接把X轴速度重置为当前水平输入乘以移动速度,如果此时玩家没有按方向键,X轴速度会被清零,后续触发跳跃就会变成垂直向上跳。
  • 物理逻辑生命周期错误:所有Rigidbody2D速度修改逻辑都放在Update中执行,Update是帧渲染回调,和物理固定步长的FixedUpdate不同步,很容易出现速度覆盖、输入丢失的时序问题。
  • 跳跃参数绑定错误:跳跃时的X轴速度使用固定常量fuerzaDeSaltoX = 2f,完全没有绑定玩家当前的水平输入方向,既不支持向左斜跳,也无法根据输入调整跳跃方向。
  • 蓄力逻辑限制错误:空格蓄力逻辑同样被包裹在地面检测块内,玩家在空中无法提前蓄力,和Jump King的核心操作逻辑不符,也会进一步加剧输入延迟导致的跳跃异常。

修复代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovimientoDeJugador : MonoBehaviour
{
    [Header("移动参数")]
    public float velocidad = 5f;
    [Header("跳跃参数")]
    public float maximaFuerzaSaltoY = 10f;
    public float relacionFuerzaX = 0.2f; // X轴跳跃力和Y轴蓄力值的比例,可自行调整斜跳水平距离

    private float fuerzaDeSaltoY;
    private float fuerzaDeEntrada;
    private bool saltoSoltado;
    private bool saltoPresionado;
    private Rigidbody2D rb2d;

    void Start()
    {
        rb2d = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 所有输入检测放在Update,保证不丢输入帧
        fuerzaDeEntrada = Input.GetAxisRaw("Horizontal");
        saltoPresionado = Input.GetKey(KeyCode.Space);
        if (Input.GetKeyUp(KeyCode.Space))
        {
            saltoSoltado = true;
        }

        // 空中也可正常蓄力,无需等落地
        if (saltoPresionado && fuerzaDeSaltoY <= maximaFuerzaSaltoY)
        {
            fuerzaDeSaltoY += 0.6f * Time.deltaTime; // 蓄力速度和原逻辑每帧加0.01的60帧速率一致
        }
    }

    private void FixedUpdate()
    {
        // 所有物理逻辑放在FixedUpdate,和物理步长同步
        if (RevisarSuelo.estaEnElSuelo)
        {
            // 优先判断跳跃触发,跳跃帧跳过地面移动速度赋值,避免X轴速度被提前清零
            if (saltoSoltado)
            {
                // X轴跳跃力绑定当前水平输入方向,和蓄力值挂钩
                float fuerzaDeSaltoX = fuerzaDeEntrada * fuerzaDeSaltoY * relacionFuerzaX;
                rb2d.velocity = new Vector2(fuerzaDeSaltoX, fuerzaDeSaltoY);
                // 重置状态
                fuerzaDeSaltoY = 0f;
                saltoSoltado = false;
                return;
            }

            // 地面正常水平移动
            rb2d.velocity = new Vector2(fuerzaDeEntrada * velocidad, rb2d.velocity.y);
        }

        // 重置跳跃触发标记,避免重复触发
        if (saltoSoltado)
        {
            saltoSoltado = false;
            fuerzaDeSaltoY = 0f; // 非地面状态松开空格直接重置蓄力
        }
    }
}

调整说明

  • 可自行修改relacionFuerzaX参数调整斜跳的水平距离,数值越大斜跳横向位移越远
  • 修复后支持空中提前蓄力,落地松开空格直接触发跳跃,匹配Jump King的原生操作逻辑
  • 如果需要空中方向微调,可在非地面判断分支下添加低力度的水平力逻辑,不需要可直接忽略

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:15:41