如何判断哪个对撞机发生了碰撞?

时间:2019-04-07 21:13:11

标签: c# unity3d

我正在创建一个有敌人的游戏,我希望游戏中有爆头,所以我有2个对撞机:一个撞到头部,一个撞到身体。我找不到任何好的方法来判断代码中的哪个。

我想到了一个解决方案,但我不喜欢它-头部的碰撞器类型不同,而身体的碰撞器类型也不同(例如多边形和盒子碰撞器)。它可以工作,但我认为它不够好(如果我想添加更多对撞机,或者有两个同类型的对撞机不起作用)。

virtual protected void OnTriggerEnter2D(Collider2D collider2D)
    {
        if (collider2D.gameObject.tag.Equals("Zombie"))
        {
            Destroy(gameObject);//destroy bullet
            Zombie zombie = collider2D.gameObject.GetComponent<Zombie>();
            if (collider2D is BoxCollider2D)
                zombie.HeadShot(demage);//headshot
            else zombie.BulletHit(demage);//normal hit
        }
    }

我想要一种以某种方式标记对撞机的方法,以便在它们之间进行区分。

2 个答案:

答案 0 :(得分:0)

您需要创建BoxCollider2D类型的公共变量并分配对撞机。发生冲突时,请在 OnTriggerEnter 内调用IF语句,以查看发生冲突的情况。无论是否存在更多相同类型的对撞机,这都将起作用。

0 matches found

isTouching是一种Unity方法,该方法根据正在比较的对撞机返回布尔值。

答案 1 :(得分:0)

我建议不要将所有对撞机都添加到同一GameObject上,而是给每个对撞机自己的子对象GameObject(这样一来,您还可以在场景视图中轻松查看哪些对撞机属于哪个轮廓;))

然后,您可以使用带有枚举的类来定义您在那里拥有的对撞机类型:

public class BodyPart : MonoBehaviour
{
    public BodyPartType Type;
}

public enum BodyPartType
{
    Head,
    LeftArm,
    RightArm,
    Body,
    LeftLeg,
    RightLeg
}

并将其附加到每个对撞机旁边的所有身体部位。

那么你可以做类似的事情

virtual protected void OnTriggerEnter2D(Collider2D collider2D)
{
    if (collider2D.gameObject.tag.Equals("Zombie"))
    {
        Destroy(gameObject);//destroy bullet

        // Note you then should use GetComponentInParent here
        // since your colliders are now on child objects
        Zombie zombie = collider2D.gameObject.GetComponentInParent<Zombie>();

        var bodyPart = collider2D.GetComponent<BodyPart>();
        switch(bodyPart.Type)
        {
            case BodyPartType.Head:
                zombie.HeadShot(demage);//headshot
                break;

            // you now could differ between more types here

            default:
                zombie.BulletHit(demage);//normal hit
                break;
        }
    }
}