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

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分离到两个子物体,通过图层分别控制:

  1. 给原物体创建两个子物体:
    • 子物体A:添加BoxCollider2D并勾选Is Trigger,设置图层为TriggerLayer
    • 子物体B:保留原物体的RigidBody2D,添加BoxCollider2D(不勾选Is Trigger),设置图层为PhysicalLayer
  2. 打开Edit > Project Settings > Physics 2D,找到碰撞矩阵:
    • 取消PhysicalLayer与目标物体图层的碰撞勾选(关闭物理碰撞)
    • 保持TriggerLayer与目标物体图层的碰撞勾选(保留触发检测)
  3. 把触发检测脚本挂载到子物体A上

这样设置后,子物体B不会与目标物体产生物理碰撞,但子物体A的触发检测依然正常工作,同时子物体B与地面的碰撞不受影响。

方案三:使用物理材质关闭碰撞响应

给可碰撞体的BoxCollider2D添加自定义物理材质:

  1. 在Project窗口右键创建Physics Material 2D
  2. 选中该材质,在Inspector面板设置:
    • Collision Response设为None
    • Friction和Bounciness设为0(避免不必要的物理效果)
  3. 将材质拖到可碰撞体的BoxCollider2D组件的Material字段

这个方法会让该碰撞体与所有物体都不产生物理碰撞,但触发检测仍会生效。如果需要仅针对特定物体关闭碰撞,建议优先用方案一或二。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:25:11