角色掉穿地面问题求助:Rigidbody配置与检测逻辑异常排查
角色掉穿地面问题排查与修复
核心冲突:CharacterController与Rigidbody混用
你同时给角色挂载了CharacterController和Rigidbody组件,这两个组件的物理逻辑完全冲突——CharacterController有独立的碰撞、移动计算体系,和Rigidbody的物理系统无法兼容,这是角色掉穿地面的核心原因。
针对性修复步骤
- 移除冗余组件:删掉角色身上的Rigidbody组件,CharacterController本身就能处理移动、碰撞与地面检测,无需依赖Rigidbody。
- 修正重力与落地逻辑:原代码的重力计算存在符号错误,且落地时对垂直速度的赋值不合理,会导致持续向下的力触发穿模。修正后的代码如下:
void Update() { Move(); isGrounded = Physics.CheckSphere(GroundCheck.position, groundRadius, (int)whatisGround); if (isGrounded) { // 落地时重置垂直速度,避免持续向下的力导致穿模 velocity.y = 0f; if (Input.GetKeyDown(KeyCode.Space)) { velocity.y = JumpForce; } } else { // 正常施加向下的重力 velocity.y -= Gravity * Time.deltaTime; } // 必须用CharacterController应用垂直方向的速度 controller.Move(velocity * Time.deltaTime); }
- 优化地面检测设置:确保
GroundCheck的Transform位置紧贴角色脚底,groundRadius不要过大(建议0.1-0.3之间),同时确认whatisGround图层仅包含地面对象。 - 调整CharacterController参数:将
Skin Width设置为0.01-0.05,这能有效减少碰撞穿模的概率;把Min Move Distance设为0,避免微小移动被忽略。
内容的提问来源于stack exchange,提问作者user19548636
相关产品推荐
相关产品推荐

