Как определить, какой из коллайдеров столкнулся? - PullRequest
2 голосов
/ 08 апреля 2019

Я создаю игру, в которой есть враги, я хочу иметь выстрелы в голову, чтобы у меня было два коллайдера: один в голову и один в тело. Я не могу найти какой-либо хороший способ сказать, что есть что в коде.

Я думал о решении, но мне оно не нравится - другой тип коллайдера для головы и другой тип для тела (например, многоугольные и коробочные коллайдеры). Это работает, но я не думаю, что это достаточно хорошо (если я хочу добавить больше коллайдеров или иметь два одинаковых типа, которые не будут работать).

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 голосов
/ 08 апреля 2019

Я бы посоветовал не добавлять все коллайдеры на один и тот же 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;
        }
    }
}
0 голосов
/ 08 апреля 2019

Вам необходимо создать открытые переменные типа BoxCollider2D и назначить коллайдеры. Когда происходит столкновение, вызовите оператор IF внутри OnTriggerEnter , чтобы увидеть, кто из них столкнулся. Это будет работать независимо от того, есть ли другие типы коллайдеров.

public class Example : MonoBehaviour
{
    public BoxCollider2D box01;
    public BoxCollider2D box02;

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.IsTouching(box01))
        {
            Debug.Log("1");
        }
        else if(collision.IsTouching(box02))
        {
            Debug.Log("2");
        }
    }
}

isTouching - это метод Unity, который возвращает логическое значение в зависимости от сравниваемого коллайдера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...