Unity新手求助:如何防止角色穿墙?
Unity胶囊体玩家穿透移动墙体的解决方案
以下是几个针对你问题的实用排查和解决步骤:
检查碰撞组件基础配置
确保玩家胶囊体和墙体都挂载了对应Collider组件(胶囊体用Capsule Collider,墙体用Box Collider),并且不要勾选Is Trigger——触发模式会跳过物理碰撞,只触发事件。同时玩家的Rigidbody必须设置为Dynamic,勾选Use Gravity(3D场景),让物理引擎能正确处理碰撞交互。修正墙体的移动方式
如果你是直接用transform.Translate()或修改transform.position移动墙体,这种方式会绕过物理引擎,导致碰撞检测失效。改成用Rigidbody的MovePosition()方法控制移动:- 给墙体添加Rigidbody组件,设置为
Kinematic(运动学刚体,不受重力但可手动控制) - 用以下脚本控制墙体移动(示例为沿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); }- 给墙体添加Rigidbody组件,设置为
提升碰撞检测精度
打开Edit > Project Settings > Physics(3D)或Physics 2D(2D):- 将玩家Rigidbody的
Collision Detection模式改为Continuous Dynamic - 将墙体Rigidbody的
Collision Detection模式改为Continuous(Kinematic刚体适用)
这能避免高速移动时的穿模问题,让物理引擎更精准地检测碰撞。
- 将玩家Rigidbody的
验证图层碰撞矩阵
打开Edit > Project Settings > Physics > Layer Collision Matrix,确认玩家所在图层和墙体所在图层对应的碰撞格子是勾选状态——如果图层间碰撞被禁用,也会出现穿模情况。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

