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

Unity 2D输入动作未释放:可变跳跃高度实现问题求助

问题分析与解决方案

核心问题

你当前代码的致命缺陷是用同步while循环在单帧内处理跳跃过程——Unity的输入状态是每帧刷新一次,而你的while循环会在一帧内直接跑完10秒的模拟(实际是瞬间),根本不会等到下一帧的输入更新,所以永远捕捉不到按钮释放的事件,自然没法触发跳跃高度的衰减逻辑。

另外你提到输入动作全程显示"performed",大概率是你的InputAction绑定设置有问题:如果跳跃动作的Trigger只设了Press,没有监听Release,或者动作类型配置错误,会导致输入状态无法正确切换。

修正方案(适配Send Messages + FSM框架)

不需要重写FSM框架,只需把跳跃逻辑拆成起跳触发和帧内检查释放两部分:

  1. 添加跳跃状态标记
    在角色脚本里新增变量记录当前是否处于跳跃上升阶段,并获取输入动作的全局引用:
private bool isAscendingJump = false;
// 替换为你实际的输入动作引用
private InputAction _jumpAction;

void Awake()
{
    // 示例:从自定义输入资产中获取跳跃动作
    var inputActions = new PlayerInputActions();
    _jumpAction = inputActions.Player.Jump;
    _jumpAction.Enable();
}
  1. 修改Jump函数(仅处理起跳)
    保留Send Messages触发的Jump函数,只负责触发起跳动作,移除无效的while循环:
public void Jump(InputAction jumpAct)
{
    if (jumpAct.WasPressedThisFrame())
    {
        rb.velocity = new Vector2(rb.velocity.x, jumpPower);
        isAscendingJump = true;
    }
}
  1. 在FSM状态的帧更新中检查释放
    找到你的Idle状态(或包含跳跃逻辑的状态)的每帧执行方法(通常叫Tick/Update),添加释放检查逻辑:
// 假设这是你的Idle状态类的Tick方法
public override void Tick()
{
    // 其他Idle状态逻辑...

    if (isAscendingJump && rb.velocity.y > 0f)
    {
        // 检查跳跃按钮是否被释放
        if (_jumpAction.WasReleasedThisFrame())
        {
            // 衰减上升速度,实现可变跳跃高度
            rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
            isAscendingJump = false;
        }
    }
    // 角色落地时重置跳跃标记
    else if (rb.velocity.y <= 0f)
    {
        isAscendingJump = false;
    }
}

额外配置检查

  • 打开你的Input Action资产,确认跳跃动作的Trigger设置:至少包含Press(触发起跳)和Release(检测释放)
  • 确保PlayerInput组件的Send Messages设置正确,跳跃动作触发时能正确调用角色的Jump方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:12:41