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

如何解决玩家跳跃落地后持续滑动问题?锁X轴方案不可行

解决玩家沿自身Y轴跳跃后落地滑动的问题

问题核心是:玩家跳跃后,Rigidbody2D会保留水平方向的速度,落地时没有自动抵消该速度,导致持续滑动。直接锁定X轴会限制跳跃方向,不符合需求,我们可以通过落地时重置水平速度来解决。

修复后的代码

public float jumpForce = 10f;
public Transform groundCheck;
public float groundDistance = 0.4f;
public LayerMask groundMask;

private Rigidbody2D rb;
private bool isGrounded;

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

private void FixedUpdate()
{
    // 检测是否在地面
    isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundDistance, groundMask);

    // 获取玩家自身Y轴方向
    Vector2 direction = transform.up;

    // 跳跃逻辑
    if (isGrounded && Input.GetButtonDown("Jump"))
    {
        rb.AddForce(direction * jumpForce, ForceMode2D.Impulse);
    }

    // 落地时重置水平方向速度,解决滑动问题
    if (isGrounded)
    {
        // 保留垂直速度,将水平速度设为0
        rb.velocity = new Vector2(0, rb.velocity.y);
    }
}

关键修复点

  • 在isGrounded为true时,通过rb.velocity = new Vector2(0, rb.velocity.y);将刚体的水平速度重置为0,同时保留垂直方向的速度,避免影响落地时的物理反馈。
  • 该方案不会限制玩家沿自身Y轴的左右跳跃方向,同时彻底解决落地滑动问题。

可选优化

如果需要更平滑的减速效果(比如模拟地面摩擦力),可以替换成动态调整阻尼的方式:

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

private void FixedUpdate()
{
    isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundDistance, groundMask);
    Vector2 direction = transform.up;

    if (isGrounded && Input.GetButtonDown("Jump"))
    {
        rb.AddForce(direction * jumpForce, ForceMode2D.Impulse);
    }

    // 动态调整阻尼模拟地面摩擦
    rb.drag = isGrounded ? 3f : 0f;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:42:10