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

Unity中用UI按钮替代GetKeyDown与GetKey实现跳跃逻辑的方法咨询

问题描述

我通过以下代码实现了基于Input.GetKeyDown和GetKey的跳跃与重力逻辑,现在想改用UI按钮实现相同功能,但不知道怎么改。我尝试过Unity新输入系统,但它是事件驱动模式,需要绑定事件方法,我的代码结构没法适配,求解决方案。

private void AppplyGravity()
{
    bool falling = velocity.y < 0f || !Input.GetKey(KeyCode.Space);
    float multiplier = falling ? 2f : 1f;
    velocity.y += gravity * multiplier * Time.deltaTime;
    velocity.y = Mathf.Max(velocity.y, gravity / 2f);
}

private void GroundedMovement()
{
    velocity.y = Mathf.Max(velocity.y, 0f);
    jumping = velocity.y > 0f;

    if (Input.GetKeyDown(KeyCode.Space))
    {
        velocity.y = jumpForce;
        jumping = true;
    }
}
解决方案

方法一:用布尔变量模拟按键状态(无需新输入系统)

你的代码核心依赖持续按住状态和按下瞬间触发两个输入逻辑,用UI按钮时可以通过自定义布尔变量模拟这两个状态:

  1. 在脚本中添加两个状态变量:
// 模拟按住跳跃按钮的状态
private bool isJumpButtonHeld;
// 模拟跳跃按钮按下的瞬间触发标记
private bool jumpTrigger;
  1. 给UI按钮绑定事件:

    • 给按钮添加EventTrigger组件,添加Pointer Down和Pointer Up事件
    • Pointer Down事件绑定脚本的OnJumpButtonDown方法
    • Pointer Up事件绑定脚本的OnJumpButtonUp方法
  2. 实现按钮事件的处理方法:

public void OnJumpButtonDown()
{
    isJumpButtonHeld = true;
    jumpTrigger = true; // 触发一次跳跃按下的逻辑
}

public void OnJumpButtonUp()
{
    isJumpButtonHeld = false;
}
  1. 修改原重力和移动代码,替换输入判断:
private void AppplyGravity()
{
    // 把原Input.GetKey判断换成自定义的isJumpButtonHeld
    bool falling = velocity.y < 0f || !isJumpButtonHeld;
    float multiplier = falling ? 2f : 1f;
    velocity.y += gravity * multiplier * Time.deltaTime;
    velocity.y = Mathf.Max(velocity.y, gravity / 2f);
}

private void GroundedMovement()
{
    velocity.y = Mathf.Max(velocity.y, 0f);
    jumping = velocity.y > 0f;

    // 用jumpTrigger模拟GetKeyDown的瞬间触发,用完重置标记
    if (jumpTrigger)
    {
        velocity.y = jumpForce;
        jumping = true;
        jumpTrigger = false; // 避免每帧重复触发
    }
}

这种方式完全保留你原有代码的逻辑结构,只是把输入来源从键盘换成了UI按钮的状态。

方法二:适配Unity新输入系统

如果一定要用新输入系统,可以通过新输入系统的API直接替换原有的Input判断,无需大幅改动代码结构:

  1. 在新输入系统中创建Player动作映射,添加一个Jump动作(类型设为Button)。
  2. 在脚本中引用输入动作:
private PlayerInput _playerInput;
private InputAction _jumpAction;

private void Awake()
{
    _playerInput = GetComponent<PlayerInput>();
    _jumpAction = _playerInput.actions["Jump"];
}
  1. 修改原代码中的输入判断:
private void AppplyGravity()
{
    // 用jumpAction.IsPressed()替代Input.GetKey(KeyCode.Space)
    bool falling = velocity.y < 0f || !_jumpAction.IsPressed();
    float multiplier = falling ? 2f : 1f;
    velocity.y += gravity * multiplier * Time.deltaTime;
    velocity.y = Mathf.Max(velocity.y, gravity / 2f);
}

private void GroundedMovement()
{
    velocity.y = Mathf.Max(velocity.y, 0f);
    jumping = velocity.y > 0f;

    // 用jumpAction.WasPressedThisFrame()替代Input.GetKeyDown(KeyCode.Space)
    if (_jumpAction.WasPressedThisFrame())
    {
        velocity.y = jumpForce;
        jumping = true;
    }
}
  1. 绑定UI按钮到输入动作:
    • 选中UI按钮,在EventTrigger中添加Pointer Down事件,调用_jumpAction.Perform()
    • 添加Pointer Up事件,调用_jumpAction.Cancel()

这样就能让新输入系统的动作响应UI按钮的按住/松开操作,完美适配你原有的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:20:13