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
相关产品推荐
相关产品推荐

