Unity中挂载Character Controller的Player子角色卡入路面问题问询
可行解决方案
- 优先调整Character Controller核心参数
- 将
Skin Width设置为角色高度的1/10左右,不要低于0.01,过小的皮肤宽度会导致碰撞检测遗漏出现下陷 - 上调
Center属性的Y轴数值,同时核对Height数值,确保碰撞体底部刚好对齐角色脚底位置,碰撞体整体完全包裹Soldier模型的所有可见部分
- 将
- 核对地面Mesh Collider配置
- 确认地面Mesh Collider未开启
Is Trigger,如果是静态地面请勾选GameObject右上角的Static标记,让Unity预生成静态碰撞缓存 - 不要直接用高精度渲染网格作为碰撞体,替换为简化后的低面数碰撞网格,避免碎面、法线错误导致的碰撞检测异常
- 确认地面Mesh Collider未开启
- 修正子对象Soldier的位置与轴心
- 检查Soldier模型的轴心点是否位于脚底位置,如果轴心在模型中心/顶部,需要调整局部Y轴坐标,确保模型脚底刚好对齐父对象Character Controller的碰撞体底部,不要超出碰撞体下边界
- 关闭动画组件的根运动(Root Motion)选项,根运动的位移计算会绕过Character Controller的碰撞逻辑,导致模型位置偏移出碰撞体范围
- 修正移动逻辑写法
- 所有Character Controller的位移操作(
Move/SimpleMove)必须放在FixedUpdate中执行,禁止直接修改Transform.position,跳过物理计算会直接导致穿模下陷 - 新增下陷补正逻辑,在FixedUpdate中加入射线检测实时修正高度:
// 地面检测距离可根据实际角色大小调整 public float groundOffset = 0.05f; void FixedUpdate() { if(Physics.Raycast(transform.position + Vector3.up * 0.2f, Vector3.down, out RaycastHit hit, 0.5f)) { if(hit.distance < groundOffset) { transform.position = new Vector3(transform.position.x, hit.point.y + groundOffset, transform.position.z); } } } - 所有Character Controller的位移操作(
- 替代方案
若上述调整均无效,可替换Character Controller为Capsule Collider + Rigidbody组合,勾选Rigidbody的Freeze Rotation X/Y/Z,碰撞检测模式设置为Continuous Dynamic,使用Rigidbody.MovePosition实现移动,该组合的碰撞稳定性远高于原生Character Controller。
内容的提问来源于stack exchange,提问作者Col_Ripley
相关产品推荐
相关产品推荐

