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

Unity中挂载Character Controller的Player子角色卡入路面问题问询

可行解决方案
  • 优先调整Character Controller核心参数
    1. 将Skin Width设置为角色高度的1/10左右,不要低于0.01,过小的皮肤宽度会导致碰撞检测遗漏出现下陷
    2. 上调Center属性的Y轴数值,同时核对Height数值,确保碰撞体底部刚好对齐角色脚底位置,碰撞体整体完全包裹Soldier模型的所有可见部分
  • 核对地面Mesh Collider配置
    1. 确认地面Mesh Collider未开启Is Trigger,如果是静态地面请勾选GameObject右上角的Static标记,让Unity预生成静态碰撞缓存
    2. 不要直接用高精度渲染网格作为碰撞体,替换为简化后的低面数碰撞网格,避免碎面、法线错误导致的碰撞检测异常
  • 修正子对象Soldier的位置与轴心
    1. 检查Soldier模型的轴心点是否位于脚底位置,如果轴心在模型中心/顶部,需要调整局部Y轴坐标,确保模型脚底刚好对齐父对象Character Controller的碰撞体底部,不要超出碰撞体下边界
    2. 关闭动画组件的根运动(Root Motion)选项,根运动的位移计算会绕过Character Controller的碰撞逻辑,导致模型位置偏移出碰撞体范围
  • 修正移动逻辑写法
    1. 所有Character Controller的位移操作(Move/SimpleMove)必须放在FixedUpdate中执行,禁止直接修改Transform.position,跳过物理计算会直接导致穿模下陷
    2. 新增下陷补正逻辑,在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为Capsule Collider + Rigidbody组合,勾选Rigidbody的Freeze Rotation X/Y/Z,碰撞检测模式设置为Continuous Dynamic,使用Rigidbody.MovePosition实现移动,该组合的碰撞稳定性远高于原生Character Controller。

内容的提问来源于stack exchange,提问作者Col_Ripley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:06:01