Unity处理多个不同用途的碰撞器

本文关键字:碰撞 处理 Unity | 更新日期: 2023-09-27 18:07:25

我有一个敌人有两个不同的碰撞器。第一个是Box Collider,它被用作敌人的hitbox。

第二个是球体碰撞器,我想用它来探测玩家和他的盟友。这个碰撞器的isttrigger属性设置为true (BoxCollider没有)。

我的问题是,当我的玩家发射抛射物时,它首先击中球体碰撞器。球体对撞机被视为一个命中箱,我的敌人会受到伤害。下面是投射脚本:

void OnTriggerEnter (Collider col)
{
    if (col.gameObject.tag == "Player")
    {
        AUnit a = col.gameObject.GetComponent<AUnit>();
        if (a != null)
        {
            a.takeDamage(damage);
            if (goThrough == false)
                Destroy(gameObject);
        }
    }
}

我的问题很简单,我如何做检测只检测BoxCollider和忽略SphereCollider ?

Unity处理多个不同用途的碰撞器

这可以通过使用基于层的碰撞检测来实现。

将玩家设置为一层,将玩家投射到另一层
然后你可以让两层在碰撞检测中忽略对方

如果你不想让它们基于层工作,因为在某些情况下,如果没有一个大的解决方案,这将无法完全工作,你可以使用以下解决方案,也应该工作得很好。

public class "ClassNameHere": MonoBehaviour
{
    public BoxCollider2D Collider1;
    public CircleCollider2D Collider2;
    public CircleCollider2D Collider3;
    private void OnCollisionEnter2D(Collision2D other)
    {
        if(other.collider==Collider1)
        {
          Debug.Log("1");
        }
        if(other.collider==Collider2)
        {
           Debug.Log("2");
        }
        if(other.collider==Collider3)
        {
           Debug.Log("3")
        }
    }
}

使用这个你将做一个特定的动作,当碰撞到一个特定的碰撞器,即使他们是在同一个游戏对象。

但是请注意,Collider没有id变量或类似的东西,这允许unity检测相同游戏对象上相同类型Collider之间的差异。但只要对撞机是不同类型的,它就可以工作。

如果你想在一个对象上使用两个相同类型的碰撞器,但仍然想要注意到它们之间的差异,你很可能需要去unity的类型碰撞器的类定义,并添加一个公共的int, float, long或string ID,你可以在代码中获得这些ID,以获得你与哪个特定类型的碰撞器进行交互。