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

Unity 2D游戏墙跳异常:角色仅高速横向移动问题求助

问题诊断与修复

你的墙跳只有横向高速移动、没有纵向上升的核心原因:墙跳设置的纵向速度被后续执行的wallSlide()方法覆盖了。

每次检测到角色贴墙时,你先调用WallJump()设置了正确的斜向速度(包含横向+纵向),但紧接着调用的wallSlide()会强制把y轴速度设为-0.4f,直接冲掉了墙跳的上升速度,导致角色只能横向移动。

修复方案

调整逻辑,只有在未触发墙跳的情况下才执行墙滑:

private Vector2 wallJumpingPower = new Vector2(10f, 20f);
private float wallJumpDirection;
private bool isWallJumpTriggered; // 用于标记是否触发墙跳

// 输入检测放在Update中
void Update()
{
    if (IsWalled())
    {   
        wallJumpDirection = -transform.localScale.x;
        isWallJumpTriggered = Input.GetButtonDown("Jump");
    }
}

// 物理逻辑放在FixedUpdate中
void FixedUpdate()
{
    if (IsWalled())
    {
        if (isWallJumpTriggered)
        {
            WallJump();
        }
        else
        {
            wallSlide();
        }
    }
}

private void WallJump()
{
    rb.velocity = new Vector2(wallJumpingPower.x * wallJumpDirection, wallJumpingPower.y);
}

private void wallSlide()
{
    rb.velocity = new Vector2(rb.velocity.x, -0.4f);
    if (hasDoubleJumped)
    {
        canDoubleJump = true;
    }
}

补充说明

  • 把输入检测(Input.GetButtonDown)放在Update()、物理速度修改放在FixedUpdate()是Unity的最佳实践,能避免输入检测遗漏或物理帧不同步的问题。
  • 如果不想拆分Update和FixedUpdate,也可以让WallJump()返回布尔值,判断是否触发墙跳后再决定是否执行墙滑,逻辑更紧凑:
// 假设这段代码在FixedUpdate中
if (IsWalled())
{   
    wallJumpDirection = -transform.localScale.x;
    bool didWallJump = WallJump();
    if (!didWallJump)
    {
        wallSlide();
    }
}

private bool WallJump()
{
    if (Input.GetButtonDown("Jump"))
    {
        rb.velocity = new Vector2(wallJumpingPower.x * wallJumpDirection, wallJumpingPower.y);
        return true;
    }
    return false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:56:02