Unity引擎Rigidbody2D角色落到平台上无法静止持续滑动问题
问题根源
你当前通过transform.SetParent绑定玩家和移动平台的逻辑,本质是直接操作被Rigidbody2D接管的Transform组件,完全绕开了2D物理引擎的计算流程:
- Rigidbody2D的位置、速度、角速度都是物理引擎在FixedUpdate周期独立计算的,Transform只是Rigidbody同步位置的输出端口,你直接修改Transform的父级关系,物理引擎不会自动将平台的运动速度同步到玩家的Rigidbody2D上
- 接触时物理引擎会根据两个碰撞体的相对速度计算摩擦力,玩家速度和平台速度不匹配时,就会出现持续的相对位移,表现为站在平台上滑动
- 你调用
SetParent传入的false参数仅会保留玩家的本地坐标,不会修改玩家Rigidbody2D存储的世界空间速度,平台移动时两者速度差始终存在,滑动问题就不会消失。
解决方案
推荐直接放弃改父子层级的实现思路,用物理系统原生的速度同步方案,稳定性最高:
方案1:运动学平台+速度同步(适配Rigidbody2D工作流,首选)
- 给移动平台(直升机)挂载Rigidbody2D,设置Body Type为
Kinematic,禁止直接修改transform.position驱动平台移动,统一使用Rigidbody2D.MovePosition()、Rigidbody2D.MoveRotation()实现平台的移动、旋转 - 保留玩家Rigidbody2D的Dynamic类型,通过碰撞检测记录玩家当前站立的平台刚体引用
- 在FixedUpdate周期内,计算玩家自身输入产生的速度后,叠加当前站立平台的速度,再赋值给玩家的Rigidbody2D
参考实现代码:
[SerializeField] private Rigidbody2D playerRb; private Rigidbody2D _currentPlatformRb; private float _moveSpeed = 6f; private float _jumpForce = 12f; private void FixedUpdate() { // 计算玩家自身输入的速度 float horizontalInput = Input.GetAxisRaw("Horizontal"); Vector2 targetVelocity = new Vector2(horizontalInput * _moveSpeed, playerRb.velocity.y); // 站在平台上时叠加平台速度 if (_currentPlatformRb != null) { targetVelocity += (Vector2)_currentPlatformRb.velocity; // 如果平台带旋转,同步角速度即可,不需要额外处理坐标 // playerRb.angularVelocity = _currentPlatformRb.angularVelocity; } playerRb.velocity = targetVelocity; // 跳跃逻辑正常实现即可 if (Input.GetKeyDown(KeyCode.Space) && CheckGrounded()) { playerRb.AddForce(Vector2.up * _jumpForce, ForceMode2D.Impulse); } } // 碰撞检测更新当前站立平台 private void OnCollisionEnter2D(Collision2D col) { if (col.collider.CompareTag("MovingPlatform")) { _currentPlatformRb = col.collider.attachedRigidbody; } } private void OnCollisionExit2D(Collision2D col) { if (col.collider.CompareTag("MovingPlatform")) { _currentPlatformRb = null; } }
这个方案完全走物理引擎原生逻辑,不会出现位置拉扯、滑动问题,高速移动的平台也能稳定跟随。
方案2:Platform Effector 2D 轻量化实现
如果不想写速度同步逻辑,可以按以下规则调整原有父子绑定逻辑:
- 给平台碰撞体添加
Platform Effector 2D组件,将玩家和平台的Physics Material 2D摩擦力调整为1,弹力设为0 - 将
SetParent的逻辑从Update移到FixedUpdate执行,避免和物理帧计算冲突 - 玩家和平台的Rigidbody2D都开启Interpolation插值,减少视觉抖动
该方案仅适合移动速度慢、加速度小的平台,速度快时依然会出现轻微滑动,稳定性弱于速度同步方案。
内容的提问来源于stack exchange,提问作者amoke
相关产品推荐
相关产品推荐

