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

2D平台游戏中双BoxCollider引发角色抖动问题求助

解决Unity 2D玩家在拼接平台上移动抖动的方案

嘿,我之前做2D平台游戏时也碰到过一模一样的问题——多个带BoxCollider的方块拼起来的平台,玩家移动时总会有轻微抖动,换CircleCollider也没改善。给你几个亲测有效的解决方案,按优先级试试:

1. 用Composite Collider 2D合并平台碰撞体(最推荐)

这是解决拼接平台抖动的根本办法,把多个小方块的碰撞体合并成一个整体,避免玩家的碰撞体逐个和小方块交互:

  • 给每个平台方块添加 Composite Collider 2D 组件
  • 勾选每个方块的 BoxCollider 2D 组件里的 Used By Composite 选项
  • 给所有平台方块的父物体添加 Rigidbody2D,设置为 Kinematic(如果平台不需要移动,也可以把父物体设为静态)
    这样整个平台就会被视为一个单一的碰撞体,玩家移动时不会再因为接缝产生抖动。

2. 优化玩家Rigidbody2D的物理参数

物理引擎的参数设置不当也会导致抖动,调整以下几个选项:

  • Collision Detection Mode:设为 Continuous Dynamic(玩家是动态物体),平台的Rigidbody2D(如果是运动学)设为 Continuous,这样物理引擎会更频繁地检测碰撞,减少穿模或抖动
  • Interpolation:设为 Interpolate,让玩家物体的运动在渲染帧之间平滑插值,视觉上消除抖动
  • Sleep Threshold:可以稍微调低一点(比如0.1),避免玩家刚体过早进入睡眠状态导致的突然唤醒抖动

3. 把移动逻辑移到FixedUpdate中

你的脚本里在Update处理移动,但物理相关的操作应该和物理引擎的固定时间步长同步,放在FixedUpdate里:
修改后的脚本片段:

public class PController : MonoBehaviour { 
    private Rigidbody2D rgdby; 
    public float moveSpeed;
    private float horizontalInput;

    void Start () { 
        rgdby = GetComponent<Rigidbody2D> ();
        // 初始化物理参数
        rgdby.collisionDetectionMode = CollisionDetectionMode2D.ContinuousDynamic;
        rgdby.interpolation = RigidbodyInterpolation2D.Interpolate;
    } 

    void Update (){ 
        // 只在Update里获取输入,处理动画等非物理逻辑
        horizontalInput = Input.GetAxisRaw("Horizontal");
    }

    void FixedUpdate() {
        // 在FixedUpdate里应用物理移动
        Vector2 currentVelocity = rgdby.velocity;
        currentVelocity.x = horizontalInput * moveSpeed;
        rgdby.velocity = currentVelocity;
    }
}

4. 更换玩家碰撞体类型(CapsuleCollider2D)

CircleCollider2D在经过方块接缝时还是会有细微的碰撞反馈,换成CapsuleCollider2D会更平滑——胶囊形的碰撞体在接触平台边缘时,过渡更自然,不容易卡边或抖动。你可以调整胶囊的大小和方向,适配你的玩家模型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:12:02