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

Unity新手求助:如何防止角色穿墙?

Unity胶囊体玩家穿透移动墙体的解决方案

以下是几个针对你问题的实用排查和解决步骤:

  • 检查碰撞组件基础配置
    确保玩家胶囊体和墙体都挂载了对应Collider组件(胶囊体用Capsule Collider,墙体用Box Collider),并且不要勾选Is Trigger——触发模式会跳过物理碰撞,只触发事件。同时玩家的Rigidbody必须设置为Dynamic,勾选Use Gravity(3D场景),让物理引擎能正确处理碰撞交互。

  • 修正墙体的移动方式
    如果你是直接用transform.Translate()或修改transform.position移动墙体,这种方式会绕过物理引擎,导致碰撞检测失效。改成用Rigidbody的MovePosition()方法控制移动:

    1. 给墙体添加Rigidbody组件,设置为Kinematic(运动学刚体,不受重力但可手动控制)
    2. 用以下脚本控制墙体移动(示例为沿X轴来回移动):
    public Rigidbody wallRb;
    public float moveSpeed = 2f;
    private float moveLimit = 5f;
    
    void Start()
    {
        wallRb = GetComponent<Rigidbody>();
        wallRb.isKinematic = true;
    }
    
    void FixedUpdate()
    {
        Vector3 targetPos = wallRb.position + Vector3.right * moveSpeed * Time.fixedDeltaTime;
        if (Mathf.Abs(targetPos.x) > moveLimit)
        {
            moveSpeed *= -1;
        }
        wallRb.MovePosition(targetPos);
    }
    
  • 提升碰撞检测精度
    打开Edit > Project Settings > Physics(3D)或Physics 2D(2D):

    • 将玩家Rigidbody的Collision Detection模式改为Continuous Dynamic
    • 将墙体Rigidbody的Collision Detection模式改为Continuous(Kinematic刚体适用)
      这能避免高速移动时的穿模问题,让物理引擎更精准地检测碰撞。
  • 验证图层碰撞矩阵
    打开Edit > Project Settings > Physics > Layer Collision Matrix,确认玩家所在图层和墙体所在图层对应的碰撞格子是勾选状态——如果图层间碰撞被禁用,也会出现穿模情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:01:07