Unity 2D俯视角游戏玩家碰撞后滑动问题求助
解决Unity 2D俯视角玩家碰撞后滑动问题
问题根源
你的代码和配置存在以下关键问题:
- 输入逻辑混乱:同时混用新输入系统回调与直接键盘检测,导致移动指令冲突
- 碰撞处理不彻底:
OnCollisionEnter2D仅触发一次,碰撞持续时刚体仍会产生速度 - 物理材质设置错误:设置0摩擦会加剧滑动,而非阻止
- 刚体参数未适配俯视角:默认重力、阻尼会导致碰撞后残留运动
解决方案
1. 修正输入与移动逻辑
将移动逻辑移至FixedUpdate(物理帧),统一使用新输入系统,添加碰撞状态控制:
public class PlayerMovement : MonoBehaviour { [SerializeField] float speed = 10f; private Vector2 movement; private Rigidbody2D rb; private bool isColliding; private void Awake() { rb = GetComponent<Rigidbody2D>(); rb.gravityScale = 0; // 关闭俯视角不需要的重力 rb.drag = 10f; // 提高阻尼快速减速 } // 绑定新输入系统的移动动作 private void OnMovement(InputValue value) { movement = value.Get<Vector2>(); } private void FixedUpdate() { if (isColliding) { rb.velocity = Vector2.zero; rb.angularVelocity = 0; return; } var moveDir = movement.normalized; rb.MovePosition(rb.position + moveDir * speed * Time.fixedDeltaTime); } private void OnCollisionEnter2D(Collision2D _) { isColliding = true; rb.velocity = Vector2.zero; rb.angularVelocity = 0; } private void OnCollisionExit2D(Collision2D _) { isColliding = false; } }
2. 调整物理材质
- 创建
Physics Material 2D,设置:- Friction:1(最大化摩擦阻止滑动)
- Bounciness:0(消除碰撞反弹)
- 将材质赋值给玩家和所有障碍物的碰撞器
3. 优化Rigidbody2D设置
确保玩家刚体参数:
- Body Type:Dynamic(必须启用物理碰撞)
- Gravity Scale:0
- Linear Drag:10+
- Angular Drag:10+
内容的提问来源于stack exchange,提问作者Cloudkicker
相关产品推荐
相关产品推荐

