Unity Physics2D.IgnoreCollision не работает должным образом - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь заставить два объекта игнорировать друг друга.Я попытался реализовать код Physics2D.IgnoreCollision, но когда он стоит, первый объект падает с неба, и либо A) непосредственно ударяется о объект ниже, остается там в течение секунды, а затем продолжает движение вниз по экрану, или B)просто отводит взгляд от объекта ниже, если он ударяет его с бокового угла.Я хочу, чтобы они полностью игнорировали друг друга.

Вот мой код:

void OnCollisionEnter2D(Collision2D collision) {
    if (collision.gameObject.tag == "obj") {
        Physics2D.IgnoreCollision(collision.gameObject.GetComponent<Collider2D>(), gameObject.GetComponent<Collider2D>());
    }
}

1 Ответ

0 голосов
/ 05 октября 2018

(как правило) лучшим решением является использование слоев для управления коллизиями между категориями элементов.Вы должны назначить помеченные obj объекты определенному слою, а объект в вашем посте - другому слою, а затем перейти в Unity Physics Manager, чтобы отключить столкновение между этими слоями.Дальнейшее руководство по этому вопросу доступно в Unity Docs .

Но если вам необходимо использовать теги, решение все еще есть.

Если вы звоните Physics2D.IgnoreCollisionвнутри события столкновения вы игнорируете только их столкновение после событие столкновения повлияло на скорость и т. д. объектов.Итак, в основном вы вызываете это слишком поздно.

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

Одно из решений - поместить вызов в объекты в их методах OnEnable (), а затем использоватьFindGameObjectsWithTag чтобы найти другие объекты для игнорирования:

public class OneObject : MonoBehaviour {

    void OnEnable() {
        GameObject[] otherObjects = GameObject.FindGameObjectsWithTag("obj");

        foreach (GameObject obj in otherObjects) {
            Physics2D.IgnoreCollision(obj.GetComponent<Collider2D>(), GetComponent<Collider2D>()); 
        }

        // rest of OnEnable
    }
   // rest of class ...
}

Если вы поместите это в OnEnable обоих типов объектов (с тегом другого объекта, конечно), оно должно соответствоватьтвои нужды.

...