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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 00:24:09