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

Unity 2D按空格键角色先跳跃后持续飞行的问题修复咨询

跳跃脚本飞行问题修复方案

问题根源

  1. 移动逻辑错误:你在Update中构建的force向量包含了rb.velocity.y,每次调用AddForce都会将当前y轴速度作为力叠加,相当于持续给角色施加向上的力,直接导致角色跳起来后持续飞行。
  2. 地面检测逻辑不完善:OnCollisionEnter2D会在角色碰到任何碰撞体时重置isJump,比如碰到天花板、墙壁都会错误允许再次跳跃,状态判断完全失效。

修复后的完整代码

Rigidbody2D rb;
public float speed = 2.5f;
public float jumpSpeed = 50f;
bool isGrounded = false; // 变量重命名,语义更清晰:是否站在地面

// 可选配置:用于精准地面检测
public LayerMask groundLayer; // 给地面物体设置专属Layer
public Transform groundCheckPoint; // 角色底部的检测点(比如空物体)
public float groundCheckRadius = 0.2f;

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

void Update() 
{
    float horizontal = Input.GetAxis("Horizontal");
    // 移动仅处理水平方向,移除y轴速度的错误叠加
    Vector3 force = new Vector3(horizontal, 0f, 0f);
    rb.AddForce(force * speed);

    // 精准地面检测:检测点周围是否存在地面层碰撞体
    isGrounded = Physics2D.OverlapCircle(groundCheckPoint.position, groundCheckRadius, groundLayer);

    // 仅在地面时允许跳跃
    if(Input.GetKeyDown(KeyCode.Space) && isGrounded)
    {
        // 跳跃时保留水平速度,避免打断移动状态
        rb.velocity = new Vector2(rb.velocity.x, jumpSpeed);
    }
}

// 若不想用检测点,也可优化碰撞事件(推荐用检测点方案)
// private void OnCollisionStay2D(Collision2D other) 
// {
//     if(other.gameObject.CompareTag("Ground"))
//     {
//         isGrounded = true;
//     }
// }

// private void OnCollisionExit2D(Collision2D other) 
// {
//     if(other.gameObject.CompareTag("Ground"))
//     {
//         isGrounded = false;
//     }
// }

关键修改说明

  • 移除y轴力叠加:移动逻辑仅处理水平方向,彻底消除持续向上的力,解决飞行问题。
  • 精准地面检测:
    • 用Physics2D.OverlapCircle实现地面检测,通过检测点+Layer的组合,避免碰到墙壁、天花板时误判为地面。
    • 若使用碰撞事件,需通过标签判断是否为地面,并用OnCollisionStay/Exit2D替代OnCollisionEnter2D,保证状态判断准确。
  • 优化跳跃逻辑:跳跃时保留水平速度,让角色跳跃过程中可以继续移动,操作体验更自然。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:45:34