Unity3D迷宫场景中如何解决玩家斜向移动穿墙问题?
Unity斜向移动穿墙问题修复方案
核心问题分析
直接用Rigidbody.MovePosition()强制位移会绕过物理引擎的连续碰撞检测,斜向移动时玩家碰撞器容易穿过墙体衔接处的微小缝隙;后续添加的碰撞回退逻辑因OnCollisionEnter重复触发,导致位置异常。
1. 改用物理引擎驱动移动(替代直接位移)
用Rigidbody.velocity控制移动,让物理引擎自动处理碰撞检测,彻底避免穿墙。同时对移动方向归一化,保证斜向与单方向移动速度一致:
public float speed = 10f; private Rigidbody rb; void Awake() { rb = GetComponent<Rigidbody>(); rb.freezeRotation = true; // 锁定旋转,防止移动时角色翻滚 } void FixedUpdate() { MovementLogic(); } private void MovementLogic() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // 构建移动方向并归一化,避免斜向移动速度超标 Vector3 moveDir = new Vector3(horizontal, 0f, vertical).normalized; // 交给物理引擎处理移动与碰撞 rb.velocity = moveDir * speed; }
2. 启用连续碰撞检测(CCD)
若仍存在穿墙情况,给玩家的Rigidbody做以下设置:
- 将Collision Detection设为
Continuous Dynamic - 确保墙体的Collider为凸形(BoxCollider默认满足,MeshCollider需勾选
Convex)
3. 移除错误的碰撞回退代码
直接删除OnCollisionEnter中的回退逻辑,物理引擎会自动阻挡角色穿过墙体,无需手动回退。
4. 优化墙体碰撞器布局
- 检查迷宫墙体板块的Collider,确保相邻墙体之间无空隙,Collider紧密贴合
- 避免随意放大Collider,使用与墙体模型匹配的精确Collider尺寸
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

