You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Unity基础平台游戏角色移动触碰墙壁卡顿问题技术求助

解决Unity 2D角色碰墙卡住的问题

嘿,作为Unity新手碰到这种卡墙的问题真的超常见!我看了你的移动脚本,问题出在直接强制设置Rigidbody2D的velocity上——当角色撞到墙时,物理引擎会试图阻挡你的移动,但你每帧都在硬塞x方向的速度,导致角色和墙面“顶牛”,就卡在那儿不动了,直到你松开按键停止施加力才恢复。

问题根源分析

你当前的FixedUpdate里直接把rb.velocity设成new Vector2(mx * movementSpeed, rb.velocity.y),这相当于完全忽略了物理碰撞的反馈:不管角色有没有碰到障碍物,都硬要让它保持这个水平速度,自然会和墙面产生冲突,导致卡顿。

可行解决方案

方案1:改用AddForce实现移动(推荐,更符合物理引擎逻辑)

这种方法是给刚体施加持续力,而非直接控制速度,物理引擎会自动处理碰撞交互,从根源避免卡墙。修改你的FixedUpdate方法:

private void FixedUpdate() {
    // 用AddForce代替直接设置velocity,ForceMode2D.Force适合持续施加的力
    rb.AddForce(new Vector2(mx * movementSpeed, 0f), ForceMode2D.Force);
    
    // 限制最大水平速度,防止角色越跑越快失去控制
    float maxHorizontalSpeed = 5f;
    if (Mathf.Abs(rb.velocity.x) > maxHorizontalSpeed) {
        rb.velocity = new Vector2(Mathf.Sign(rb.velocity.x) * maxHorizontalSpeed, rb.velocity.y);
    }
}

注意:这里的movementSpeed数值要调小一些,因为AddForce的力度量级和直接设置velocity不一样,比如原来设50,现在改设5左右就够了,你可以根据实际手感慢慢调整。

方案2:检测墙面碰撞,碰到墙时停止施加水平力

如果你还是想保留直接设置velocity的方式,可以在设置前先检测角色左右是否有墙,有墙时就不再强制施加水平速度:

首先在脚本里新增一个检测墙面的方法:

public bool isTouchingWall() {
    // 用两个射线检测角色左右两侧,可根据角色大小调整射线长度和起始位置
    RaycastHit2D leftHit = Physics2D.Raycast(transform.position, Vector2.left, 0.6f, groundLayer);
    RaycastHit2D rightHit = Physics2D.Raycast(transform.position, Vector2.right, 0.6f, groundLayer);
    
    // 左右任意一侧碰到墙就返回true
    return leftHit.collider != null || rightHit.collider != null;
}

然后修改FixedUpdate逻辑:

private void FixedUpdate() {
    float targetHorizontalVelocity = rb.velocity.x;
    
    // 只有没碰到墙的时候,才根据输入设置水平速度
    if (!isTouchingWall()) {
        targetHorizontalVelocity = mx * movementSpeed;
    } else {
        // 碰到墙时把水平速度清零,也可以设个小数值模拟摩擦力
        targetHorizontalVelocity = 0f;
    }
    
    rb.velocity = new Vector2(targetHorizontalVelocity, rb.velocity.y);
}

小提示:如果你的墙面和地面不在同一个Layer,建议单独建一个wallLayer专门用于墙面检测,这样结果会更准确。

额外优化建议

  • 调整Rigidbody2D参数:把Linear Drag设为1-2,让角色停止移动时能自然减速;把Collision Detection设为Continuous Dynamic,防止角色高速移动时出现穿模。
  • 检查地面检测:确保feet的Transform位置在角色脚底中心,OverlapCircle的半径不要太大,避免误判地面碰撞。

你之前注释掉的那段修复代码逻辑没找对问题点,直接删掉就好啦~

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

火山引擎 最新活动