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

Unity 2D如何解决玩家与物体碰撞抖动及穿透问题?

解决2D游戏碰撞体穿透与物体被推入地面的问题

针对你遇到的玩家跳跃碰撞物体时,物体被推入地面的问题,结合你的设置和代码,给出以下具体解决步骤:

1. 调整刚体质量与物理响应参数

  • 从你的截图来看,玩家与可碰撞物体的刚体质量均为1,玩家重力缩放为6,下落时的冲击力会轻易推动物体。建议增大可碰撞物体的质量(比如设为2-3),让玩家的质量不足以轻易将其压入地面;如果物体是不可移动的场景道具,直接将其刚体设为Kinematic类型,彻底固定位置。
  • 调大物理设置中的Contact Offset(比如从0.01改为0.02),同时确保碰撞体的Skin Width设置为Contact Offset的一半左右,帮助物理引擎提前检测碰撞,避免穿透。

2. 修正地面检测逻辑

  • 检查你的ground LayerMask是否仅包含地面层,不要包含可碰撞物体层。如果当前ground层包含了物体,玩家碰到物体时会误判为"在地面",导致不必要的力传递。修正后,groundCheck只会检测真正的地面:
    void groundCheck()
    {
        // 确保ground LayerMask仅勾选地面层
        if (Physics2D.OverlapBox(groundCheckObject.transform.position, groundChecksize, 0, ground))
        {
            LastOnGroundTime = coyoteTime;
        }
    }
    

3. 优化力的施加方式,提升物理稳定性

  • 将FixedUpdate中移动力的施加从AddForce改为直接修改velocity,避免力的累积导致的不稳定:
    private void FixedUpdate()
    {
        float targetSpeed = moveInput.x * moveSpeed;
        float speedDif = targetSpeed - rb.velocity.x;
        float accelRate = (Mathf.Abs(targetSpeed) > 0.01f) ? acceleration : decceleration;
        float movement = Mathf.Pow(Mathf.Abs(speedDif) * accelRate, velPower) * Mathf.Sign(speedDif);
        // 直接修改velocity,替代AddForce
        rb.velocity = new Vector2(rb.velocity.x + movement * Time.fixedDeltaTime, rb.velocity.y);
    }
    
  • 跳跃切断逻辑也改为直接调整velocity,比AddForce更可控:
    if (Input.GetKeyUp(KeyCode.Space) && isJumping && rb.velocity.y > 1f)
    {
        rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * jumpCut);
    }
    

4. 开启连续碰撞检测与调整碰撞体

  • 给可碰撞物体的Rigidbody2D开启Continuous Collision Detection(连续碰撞检测),选择Continuous模式,避免高速运动时的碰撞穿透。
  • 检查碰撞体的大小,确保物体的碰撞体有足够的高度,不要过于薄,否则物理引擎难以准确处理碰撞。

5. 检查碰撞层级矩阵

  • 打开Edit > Project Settings > Physics 2D,查看Layer Collision Matrix,确保玩家层与可碰撞物体层、物体层与地面层之间的碰撞是开启状态,避免物体因为层级设置错误无法与地面碰撞,导致被玩家压入地面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:59:51