Найдите оба коллайдера, участвующие в столкновении на GameObject с несколькими коллайдерами - PullRequest
0 голосов
/ 02 июня 2018

Подводя итог следующему: Я хочу найти оба коллайдера, участвующих в столкновении, из события OnTriggerEnter2D.Как я могу это сделать?

У меня есть два игровых объекта.Оба имеют коллайдер и триггер.

На объекте А он окружен триггером.На объекте B триггер окружает только определенный участок.

Когда триггер объекта A касается любого коллайдера, триггера или нет, объекта B: я хочу, чтобы объект B потерял здоровье.И наоборот.

Однако, когда триггер объекта A касается коллайдера (не триггера) объекта B, оба объекта теряют здоровье.

Я получаю это в консоли

Object A hit Object B
Object B hit Object A

Я пришел к выводу, что триггер объекта A вызывает событие Ontrigger2d на объекте B.

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

Как узнать, какой триггер «нашел» столкновение?

[Также опубликовано на форумах Unity]

РЕДАКТИРОВАТЬ: код

private void OnTriggerEnter2D(Collider2D collision)
{
    Consumeable con = collision.GetComponentInParent<Consumable>();

    if (con != null && con.gameObject != gameObject)
    {
        Debug.Log(gameObject.name + " hit " + con.gameObject.name);

        con.Damage(1);
    }
}

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Один из способов добиться этого - создать дочерний игровой объект для обработки одного из коллайдеров.

Так, например, у вас есть родительский объект, который имеет не триггерный коллайдер, и дочерний объект с триггерным коллайдером.

Таким образом, легко определить, какие коллайдеры участвуют в столкновении.

0 голосов
/ 02 июня 2018

Подводя итог, я хочу найти оба коллайдера, участвующих в столкновении

Существует переменная gameObject, объявленная, когда ваш сценарий наследуется от MonoBehaviour.Эта переменная ссылается на GameObject, к которому прикреплен этот скрипт.Вы можете получить один GameObject с этой переменной gameObject, а другой - из аргумента Collider2D в функции OnTriggerEnter.

void OnTriggerEnter2D(Collider2D collision)
{
    GameObject obj1 = this.gameObject;
    GameObject obj2 = collision.gameObject;

    Debug.Log("Triggered Obj1: :" + obj1.name);
    Debug.Log("Triggered obj2: :" + obj2.name);
}

EDIT :

Объекты для меня бесполезны.Мне нужны коллайдеры.И нет, я не могу использовать 'getcomponent', потому что у них более одного коллайдера, и мне нужны только те, которые находятся в коллизии

Коллайдеры должны быть дочерними по отношению к GameObject, и скрипт долженбыть присоединенным к каждому дочернему коллайдеру, тогда то, что в этом ответе должно работать.


Если по какой-то причине вы должны сделать это, не делая коллайдеры дочерними для этого GameObject, тогда используйте логическую переменную для обнаружения коллизии только один раз .

Это модификация ответа от этой записи.

Иметь локальную Collider2D переменную с именем theOtherCollider для хранения коллизииданные, впервые сообщаемые при вызове OnTriggerEnter2D, затем имеют другую переменную boolean с именем detectedBefore, чтобы определить, был ли ранее вызван OnTriggerEnter2D.

Когда вызывается OnTriggerEnter2D, проверьте, если local / this версия этой переменной boolean равна false.Если это не true, то это первый раз, когда OnTriggerEnter2D был вызван.Используйте GetComponent, чтобы получить другой скрипт, затем установите переменную boolean скрипта other на true.В то же время, также инициализируйте переменную theOtherCollider в скрипте other значением Collider2D из функции OnTriggerEnter2D.

Теперь, если вызывается OnTriggerEnter2Dи local / this версия этой переменной boolean равна true, установите ее на false, чтобы сбросить ее, затем получите оба коллайдера с переменной theOtherCollider и переменную Collider2D из OnTriggerEnter2D функция.

Это может сбивать с толку, но, глядя на код, его легче понять.

Примечание:

YOURSCRIPT - это имя скрипта функции OnTriggerEnter2Dнаходится внутри, и это прикреплено к коллайдерам.Вы должны изменить его на имя того сценария.

public bool detectedBefore = false;
public Collider2D theOtherCollider;

void OnTriggerEnter2D(Collider2D collision)
{
    //Get both colliders then exit if we have already ran this code below
    if (detectedBefore)
    {
        //Reset
        detectedBefore = false;

        //Get both Colliders once below
        Collider2D col1 = theOtherCollider;
        Collider2D col2 = collision;

        Debug.Log("Triggered Obj1: " + col1.name);
        Debug.Log("Triggered obj2: " + col2.name);

        return; //EXIT the function
    }

    //Set the other detectedBefore variable to true then set get the first Collider
    YOURSCRIPT myScript = collision.gameObject.GetComponent<YOURSCRIPT>();
    if (myScript)
    {
        myScript.detectedBefore = true;
        myScript.theOtherCollider = collision;
    }

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