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

如何在不关闭重力的情况下使用Rigidbody防止GameObject坠落

Unity对象持续坠落及敌人穿地问题排查与解决

一、对象持续坠落的核心排查点

  • 地面碰撞体缺失:检查地面游戏对象是否添加了Box Collider(或匹配地面形状的碰撞体),且Is Trigger未勾选。无碰撞体的地面无法阻挡Rigidbody对象,会导致对象持续坠落。
  • 玩家碰撞体配置错误:确认玩家对象(如胶囊体)是否添加Capsule Collider,且碰撞体的大小、位置完全包裹模型,无偏移或尺寸过小的情况。
  • Rigidbody参数异常:
    • 检查Mass(质量)设置是否合理,极端值可能导致物理行为异常;
    • 若需角色保持在地面,可临时在Rigidbody的Constraints中锁定Y轴位置(后续若需跳跃再调整);
    • 脚本中_rb.useGravity = true设置正确,但无地面碰撞时,重力必然导致坠落。

二、敌人胶囊体穿地的解决方法

  • 敌人组件配置不全:敌人胶囊体必须同时挂载Capsule Collider和Rigidbody组件,且碰撞体的Is Trigger未勾选。
  • 碰撞矩阵设置错误:打开Edit > Project Settings > Physics,检查地面与敌人所属Layer的碰撞矩阵,确保两者处于可碰撞状态。
  • 初始位置异常:敌人初始Transform的Y轴坐标需高于地面,若初始位置在地面以下,会直接穿过地面继续坠落。

三、PlayerBehaviour脚本优化建议

当前脚本使用_rb.MovePosition直接设置位置,会绕过物理系统的碰撞检测,可能加剧穿地问题。建议改用AddForce让物理系统处理交互:

void FixedUpdate()
{
    SetVerticalDirection();
    SetHorizontalDirection();
    
    // 用AddForce实现符合物理规则的移动
    Vector3 moveDirection = transform.forward * _vInput1;
    _rb.AddForce(moveDirection, ForceMode.Force);
    
    // 旋转逻辑保持不变
    Vector3 rotation = Vector3.up * _hInput1;
    Quaternion angleRotation = Quaternion.Euler(rotation * Time.fixedDeltaTime);
    _rb.MoveRotation(_rb.rotation * angleRotation);
}

另外,脚本类名PlayerBehavoiur存在拼写错误,建议修正为PlayerBehaviour,避免后续混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:15:40