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

Unity中if条件成立时如何实现2D角色按住按键自动连续跳跃

问题背景
  • 开发场景:基于Unity引擎开发2D游戏,已实现基础的角色水平移动、地面检测跳跃功能,脚本可正常运行
  • 现存问题:当前跳跃逻辑要求角色落地后必须松开空格键、再次按下才能触发下一次跳跃
  • 预期效果:按住空格键不松开的状态下,角色接触地面判定生效时自动触发连续跳跃,无需重复松按按键
问题根源

原有代码使用Input.GetKeyDown(KeyCode.Space)作为跳跃触发的输入判断,该API仅在按键按下的第一帧返回true,后续持续按住按键的所有帧都会返回false。因此即使角色落地后isjumping状态被重置为非跳跃,只要玩家没有松开空格重新触发按键按下动作,跳跃逻辑就不会被执行。

另外原代码存在一处隐性bug:触发跳跃加力时没有同步更新isjumping状态,依赖OnCollisionExit2D切换状态会导致角色刚起跳、还未离开地面碰撞盒的几帧内仍被判定为在地面,可能触发异常多段跳。

修改方案
  • 新增布尔变量holdJump,用Input.GetKey(KeyCode.Space)持续检测空格键的按住状态(该API只要按键处于按住状态,每帧都会返回true)
  • 将跳跃执行逻辑抽为独立方法,触发跳跃时同步更新isjumping状态,同时重置y轴速度、指定冲量力模式,统一跳跃手感
  • 在地面接触判定的逻辑节点新增判断:角色落地时如果检测到玩家正按住跳跃键,直接自动触发跳跃
  • 清理原代码中未被使用的冗余变量moveY

修改后的完整代码如下:

using UnityEngine;

public class Player2DController : MonoBehaviour
{
    private Rigidbody2D rb;
    public float moveSpeed;
    private float horizontalInput;
    private bool isJumping;
    // 记录跳跃键按住状态
    private bool holdJumpInput;
    public float jumpImpulse;
    public GameObject sqaureee;

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

    void Update()
    {
        horizontalInput = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(horizontalInput * moveSpeed, rb.velocity.y);

        // 每帧更新跳跃键按住状态
        holdJumpInput = Input.GetKey(KeyCode.Space);

        // 保留原有的按下瞬间跳跃逻辑
        if (Input.GetKeyDown(KeyCode.Space) && !isJumping)
        {
            PerformJump();
        }
    }

    // 抽离跳跃逻辑,避免重复代码
    private void PerformJump()
    {
        // 跳跃前重置y轴速度,保证每次跳跃高度一致
        rb.velocity = new Vector2(rb.velocity.x, 0);
        // 冲量模式更适合跳跃这种瞬间施加的力
        rb.AddForce(new Vector2(0, jumpImpulse), ForceMode2D.Impulse);
        isJumping = true;
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        GetComponent<SpriteRenderer>().color = Color.red;

        if (collision.gameObject.CompareTag("Ground"))
        {
            isJumping = false;
            // 落地时如果按住跳跃键,自动触发跳跃
            if (holdJumpInput)
            {
                PerformJump();
            }
        }
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        GetComponent<SpriteRenderer>().color = Color.white;

        if (collision.gameObject.CompareTag("Ground"))
        {
            isJumping = true;
        }
    }
}

优化提示:如果需要做「土狼时间」「跳跃缓冲」之类的更顺滑的2D平台跳跃手感,可以在这个逻辑基础上新增对应的时间计数器即可,当前的输入状态拆分逻辑已经可以支持后续扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:18:52