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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 04:45:03