Unity3D角色仅双向移动时穿过物体 调整碰撞器后仍未解决求助
问题原因
直接修改Rigidbody.position属性等价于强制传送刚体,会完全绕过Unity物理引擎的碰撞检测流程。当同时输入两个方向指令时,水平和垂直方向的移动向量叠加后,实际移动速度是单方向移动的√2倍,速度更快就更容易出现帧间位置跳变穿过碰撞体的情况,因此仅在双方向输入时触发穿模问题。同时你代码中FixedUpdate内使用Time.deltaTime也是不规范的,固定物理更新应当使用Time.fixedDeltaTime计算时间间隔。
修复方案
- 替换直接修改
rb.position的逻辑,改用物理系统原生的Rigidbody.MovePosition()方法执行移动,该方法会自动在移动过程中进行碰撞检测,不会跳过碰撞判定。 - 给输入向量做归一化处理,避免斜向移动速度异常偏高的问题,同时降低高速移动带来的穿模概率。
- 将Rigidbody组件的
Collision Detection属性从默认的Discrete修改为Continuous Dynamic,针对高速移动物体优化碰撞检测精度,避免帧间隔过长导致的穿模。
修复后代码示例
float moveSpeed = 6f; float rotationSpeed = 6f; Vector3 moveDirection; Rigidbody rb; void Awake() { rb = GetComponent<Rigidbody>(); // 也可以代码动态设置碰撞检测模式,不需要可以直接在Inspector面板修改 rb.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic; } void FixedUpdate() { Move(); } void Move() { float hAxis = Input.GetAxis("Horizontal"); float vAxis = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(hAxis, 0f, vAxis); // 归一化处理,保证各方向移动速度一致 if (movement.magnitude > 1f) { movement.Normalize(); } // 用MovePosition替代直接修改position,使用fixedDeltaTime计算物理帧间隔 rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime); }
内容的提问来源于stack exchange,提问作者Batu
相关产品推荐
相关产品推荐

