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

Unity引擎Rigidbody2D角色落到平台上无法静止持续滑动问题

问题根源

你当前通过transform.SetParent绑定玩家和移动平台的逻辑,本质是直接操作被Rigidbody2D接管的Transform组件,完全绕开了2D物理引擎的计算流程:

  • Rigidbody2D的位置、速度、角速度都是物理引擎在FixedUpdate周期独立计算的,Transform只是Rigidbody同步位置的输出端口,你直接修改Transform的父级关系,物理引擎不会自动将平台的运动速度同步到玩家的Rigidbody2D上
  • 接触时物理引擎会根据两个碰撞体的相对速度计算摩擦力,玩家速度和平台速度不匹配时,就会出现持续的相对位移,表现为站在平台上滑动
  • 你调用SetParent传入的false参数仅会保留玩家的本地坐标,不会修改玩家Rigidbody2D存储的世界空间速度,平台移动时两者速度差始终存在,滑动问题就不会消失。
解决方案

推荐直接放弃改父子层级的实现思路,用物理系统原生的速度同步方案,稳定性最高:

方案1:运动学平台+速度同步(适配Rigidbody2D工作流,首选)

  1. 给移动平台(直升机)挂载Rigidbody2D,设置Body Type为Kinematic,禁止直接修改transform.position驱动平台移动,统一使用Rigidbody2D.MovePosition()、Rigidbody2D.MoveRotation()实现平台的移动、旋转
  2. 保留玩家Rigidbody2D的Dynamic类型,通过碰撞检测记录玩家当前站立的平台刚体引用
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:18:22