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按钮时可以通过自定义布尔变量模拟这两个状态:
- 在脚本中添加两个状态变量:
// 模拟按住跳跃按钮的状态 private bool isJumpButtonHeld; // 模拟跳跃按钮按下的瞬间触发标记 private bool jumpTrigger;
给UI按钮绑定事件:
- 给按钮添加
EventTrigger组件,添加Pointer Down和Pointer Up事件 Pointer Down事件绑定脚本的OnJumpButtonDown方法Pointer Up事件绑定脚本的OnJumpButtonUp方法
- 给按钮添加
实现按钮事件的处理方法:
public void OnJumpButtonDown() { isJumpButtonHeld = true; jumpTrigger = true; // 触发一次跳跃按下的逻辑 } public void OnJumpButtonUp() { isJumpButtonHeld = false; }
- 修改原重力和移动代码,替换输入判断:
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判断,无需大幅改动代码结构:
- 在新输入系统中创建
Player动作映射,添加一个Jump动作(类型设为Button)。 - 在脚本中引用输入动作:
private PlayerInput _playerInput; private InputAction _jumpAction; private void Awake() { _playerInput = GetComponent<PlayerInput>(); _jumpAction = _playerInput.actions["Jump"]; }
- 修改原代码中的输入判断:
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; } }
- 绑定UI按钮到输入动作:
- 选中UI按钮,在
EventTrigger中添加Pointer Down事件,调用_jumpAction.Perform() - 添加
Pointer Up事件,调用_jumpAction.Cancel()
- 选中UI按钮,在
这样就能让新输入系统的动作响应UI按钮的按住/松开操作,完美适配你原有的逻辑。
内容的提问来源于stack exchange,提问作者Blinkz
相关产品推荐
相关产品推荐

