Unity2D中如何关闭物体物理碰撞并保留触发检测?
解决方法
首先纠正你脚本里的一个关键错误:OnTriggerEnter2D的参数类型应该是Collider2D,而非Collision2D,正确写法如下:
private void OnTriggerEnter2D(Collider2D coll) { Debug.Log("Triggered"); }
接下来提供三种可行的解决方案,都能实现「关闭物理碰撞但保留触发检测」的需求:
方案一:手动忽略特定碰撞
给带可碰撞体的物体添加如下脚本,在首次物理碰撞时忽略与触发体的物理交互,但触发检测不受影响:
using UnityEngine; public class IgnoreTargetCollision : MonoBehaviour { // 在Inspector面板拖拽触发体的BoxCollider2D组件到这里 public Collider2D targetTriggerCollider; private BoxCollider2D ownCollider; void Awake() { ownCollider = GetComponent<BoxCollider2D>(); } private void OnCollisionEnter2D(Collision2D collision) { if (collision.collider == targetTriggerCollider) { // 忽略两者的物理碰撞,第三个参数设为true表示永久忽略 Physics2D.IgnoreCollision(ownCollider, targetTriggerCollider, true); } } }
这个方法的优势是精准控制单个物体间的碰撞,不影响其他物体的物理交互,且物体与地面的碰撞会正常保留。
方案二:拆分碰撞体与触发体到不同子物体
把触发检测和物理碰撞的Collider分离到两个子物体,通过图层分别控制:
- 给原物体创建两个子物体:
- 子物体A:添加
BoxCollider2D并勾选Is Trigger,设置图层为TriggerLayer - 子物体B:保留原物体的
RigidBody2D,添加BoxCollider2D(不勾选Is Trigger),设置图层为PhysicalLayer
- 子物体A:添加
- 打开
Edit > Project Settings > Physics 2D,找到碰撞矩阵:- 取消
PhysicalLayer与目标物体图层的碰撞勾选(关闭物理碰撞) - 保持
TriggerLayer与目标物体图层的碰撞勾选(保留触发检测)
- 取消
- 把触发检测脚本挂载到子物体A上
这样设置后,子物体B不会与目标物体产生物理碰撞,但子物体A的触发检测依然正常工作,同时子物体B与地面的碰撞不受影响。
方案三:使用物理材质关闭碰撞响应
给可碰撞体的BoxCollider2D添加自定义物理材质:
- 在Project窗口右键创建
Physics Material 2D - 选中该材质,在Inspector面板设置:
- Collision Response设为
None - Friction和Bounciness设为0(避免不必要的物理效果)
- Collision Response设为
- 将材质拖到可碰撞体的
BoxCollider2D组件的Material字段
这个方法会让该碰撞体与所有物体都不产生物理碰撞,但触发检测仍会生效。如果需要仅针对特定物体关闭碰撞,建议优先用方案一或二。
内容的提问来源于stack exchange,提问作者Bartosz Dar
相关产品推荐
相关产品推荐

