【Unity学习笔记】(OnTriggerEnter2D)碰撞检测失效

问题描述

Unity 碰撞检测失效
检查代码无误

private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Enemy"))
        {
            collision.GetComponent<Enemy>().TakeDamage(damage);
            Debug.Log("isEnemy");
        }

        if (collision.gameObject.CompareTag("Player")
            && collision.GetType().ToString() == "UnityEngine.CapsuleCollider2D")
        {
            playerHealth.DamagePlayer(damage);
            Debug.Log("isPlayer");
        }
    }

原因分析:

  1. 最开始怀疑是 Project setting 中的Physics的layer collision没有修改好,导致碰撞检测失效
  2. 修改了之后发现还是不行,查阅资料怀疑是OnTriggerEnter2D的触发条件不满足

解决:

最终给实体添加了一个刚体,满足OnTriggerEnter2D的触发条件。
注意:修改 Layer Collision 时需注意查看是 Physics 还是 Physics 2D


学习笔记:

参考博客:https://blog.youkuaiyun.com/renatqiang/article/details/47682449

一:产生碰撞的条件
1:若要产生碰撞,必须双方都要有碰撞器。
2:运动的一方一定要有刚体,另一方有无刚体无所谓。
注:如果运动的一方无刚体,它去碰撞静止的刚体,相当于没有装上。

二:接触的两种方式
1:Collision碰撞,造成物理碰撞,可以在碰撞时执行OnCollision事件。
2:Trigger触发,取消所有的物理碰撞,可以在触发时执行OnTrigger事件。
注:两个物体接触不可能同时产生碰撞+接触,最多产生一种。但是可以AB产生碰撞,AC产生触发。

三:产生不同方式接触的条件
1:Collision碰撞
(1):双方都有碰撞体
(2):运动的一方必须有刚体
(3):双方不可同时勾选Kinematic运动学。
(4):双方都不可勾选Trigger触发器。
2:Trigger触发
(1):双方都有碰撞体
(2):运动的一方必须是刚体
(3):至少一方勾选Trigger触发器

四:接触后事件细分为Enter,Stay,Exit三种(以Trigger为例,分别为OnTriggerEnter、OnTriggerStay、OnTriggerExit)
1:Enter事件表示两物体接触瞬间,会执行一次。
2:Stay事件表示两物体持续接触,会不断执行。
3:Exit事件当两物体分开瞬间,会执行一次。


Unity中,`OnTriggerEnter2D`方法用于检测2D碰撞体的触发事件。默认情况下,`OnTriggerEnter2D`方法只能检测到与当前对象直接碰撞的碰撞体,而不能直接检测到子对象的碰撞体。 然而,你可以通过一些方法来实现检测子对象的碰撞体: 1. **递归检测**:在`OnTriggerEnter2D`方法中,递归遍历当前对象的子对象,检查是否有子对象触发了碰撞体。 ```csharp void OnTriggerEnter2D(Collider2D other) { CheckChildren(other, gameObject); } void CheckChildren(Collider2D other, GameObject parent) { foreach (Transform child in parent.transform) { if (child.gameObject.GetComponent<Collider2D>() == other) { // 处理碰撞事件 Debug.Log("子对象碰撞检测到: " + child.name); } CheckChildren(other, child.gameObject); } } ``` 2. **使用标签或层**:为子对象设置特定的标签或层,然后在`OnTriggerEnter2D`方法中根据标签或层进行过滤和处理。 ```csharp void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("ChildColliderTag")) { // 处理碰撞事件 Debug.Log("子对象碰撞检测到: " + other.name); } } ``` 3. **消息传递**:在子对象的碰撞体上添加脚本,并在触发事件时通过消息传递机制通知父对象。 ```csharp // 子对象脚本 void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("ParentTag")) { // 通知父对象 transform.parent.SendMessage("ChildTriggerEnter", other); } } // 父对象脚本 void ChildTriggerEnter(Collider2D other) { // 处理碰撞事件 Debug.Log("子对象碰撞检测到: " + other.name); } ``` 通过这些方法,你可以实现对子对象碰撞体的检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值