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

Unity中碰撞检测失效导致角色无法垂直攀爬移动问题求助

问题分析与修复方案

核心问题排查

  • 碰撞触发未生效:OnCollisionStay2D可能没正确触发,比如wall1RightBorder的标签未设为wall1RightBorder、碰撞体未启用,或是Player的Rigidbody2D未设为Dynamic,导致碰撞检测无响应。
  • 物理逻辑抵消移动:直接覆盖rb.velocity的X轴为0,可能和物理引擎的碰撞响应冲突,抵消了垂直方向的移动力;同时未处理重力影响,角色受重力拉扯无法稳定攀爬。
  • 贴合判定不严谨:仅靠标签检测碰撞,未验证接触方向,可能非侧面贴合的碰撞也误触发攀爬逻辑。

修复后的代码

public class Player : MonoBehaviour
{
    public GameObject wallRef;
    public Rigidbody2D rb;
    private bool touchingWall = false;
    public float climbSpeed = 5f;
    private float originalGravity;

    void Start()
    {
        originalGravity = rb.gravityScale;
        // 确保墙体对象正确获取
        GameObject wall1 = wallRef.transform.Find("Wall1").gameObject;
    }

    void Update()
    {
        if (touchingWall)
        {
            float verticalInput = Input.GetAxis("Vertical");
            // 保留水平方向的碰撞响应,仅修改垂直速度
            rb.velocity = new Vector2(rb.velocity.x, verticalInput * climbSpeed);
        }
        else
        {
            // 离开墙体后恢复初始重力
            rb.gravityScale = originalGravity;
        }
    }

    void OnCollisionStay2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("wall1RightBorder"))
        {
            // 验证碰撞方向:确保角色从右侧贴合墙体(法线指向左)
            foreach (ContactPoint2D contact in collision.contacts)
            {
                if (Mathf.Abs(contact.normal.x + 1f) < 0.1f)
                {
                    touchingWall = true;
                    // 攀爬时关闭重力,防止滑落
                    rb.gravityScale = 0;
                    break;
                }
            }
        }
    }

    void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("wall1RightBorder"))
        {
            touchingWall = false;
        }
    }
}

额外设置建议

  • 确认wall1RightBorder的Collider2D未勾选Is Trigger,且与Player的碰撞体(如CapsuleCollider2D)的交互层级已开启。
  • 给Player的Rigidbody2D设置1-3的Linear Drag值,让攀爬移动更平滑。
  • 若仍出现穿墙问题,可在攀爬时添加rb.constraints = RigidbodyConstraints2D.FreezePositionX,退出攀爬时恢复RigidbodyConstraints2D.None。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:44:59