Unity玩家碰撞脚本异常:角色撞墙大幅抖动问题排查求助
核心问题定位
- 手动强制修改刚体位置的逻辑和物理碰撞解算互相拉扯:在
FixedUpdate中直接执行myRigidbody.position += velocity * Time.deltaTime,本质是每物理步强制把玩家拉到计算出的坐标,碰到墙体时,碰撞系统会解算阻挡把玩家位置推回合理范围,随后你的代码又会强制把位置往墙的方向拉,循环往复就形成了肉眼可见的剧烈抖动,这和脚本运行速度没有关系。 - 碰撞体配置错配:代码中实现了
OnTriggerEnter回调,说明当前物体的碰撞体勾选了Is Trigger属性。触发器不会产生实体阻挡效果,哪怕位移逻辑完全正确,也会直接穿过墙体。 - 切换到
MovePosition后抖动加剧的原因:Interpolate选项的作用是在物理固定步的离散位置之间做平滑补间,当物理步内的位置因为“代码强制拉位置-碰撞系统推回去”的逻辑来回跳变时,补间计算出的每帧渲染位置会被进一步放大抖动幅度,视觉上就会比之前的抖动更严重。
对应修复步骤
- 调整物理组件基础配置:
- 玩家、墙体的实体阻挡碰撞体全部取消
Is Trigger勾选 - 玩家的Rigidbody关闭
Is Kinematic,顶视角移动场景下将重力系数调整为0,避免无意义的垂直方向受力
- 玩家、墙体的实体阻挡碰撞体全部取消
- 替换错误的位移逻辑,不要手动强制修改刚体位置:
void FixedUpdate() { // 直接给刚体赋值目标水平速度,由物理引擎统一处理碰撞解算 myRigidbody.velocity = new Vector3(velocity.x, myRigidbody.velocity.y, velocity.z); }
这种写法下,物理引擎检测到碰撞时会自然抵消指向墙体方向的速度分量,不会出现代码强制位移和碰撞解算来回拉扯的抖动。
- 如果坚持使用
MovePosition实现移动,需要将玩家的Rigidbody设置为运动学刚体(勾选Is Kinematic),且所有位移计算完全在FixedUpdate中完成,不能将Update中计算的位移跨帧硬塞给物理步处理,这种时序错位本身就会引发抖动。 - 原代码中的
OnTriggerEnter回调仅用于交互类触发检测时,需要单独为交互区域的碰撞体勾选Is Trigger,实体墙体的碰撞体绝对不能开启触发器属性。
内容的提问来源于stack exchange,提问作者Kit
相关产品推荐
相关产品推荐

