Обнаружение перекрывающихся коллайдеров polygon2D в Unity

#c# #unity3d

#c# #unity3d

Вопрос:

Я пытаюсь запрограммировать сценарий размещения изометрического здания. В каждом здании есть компонент PolygonCollider2D с триггером. При размещении нового здания я пытаюсь проверить, перекрывается ли PolygonCollider2D размещенного здания с чем-либо еще (чтобы проверить, допустимо ли размещение). Мой код выглядит следующим образом:

Отрегулируйте точки нового размещенного строительного коллайдера в зависимости от положения мыши

 Vector2[] points = polygonCollider2D.points;
points.SetValue(polygonCollider2D.points[0]   (Vector2)mousePosition, 0);
points.SetValue(polygonCollider2D.points[1]   (Vector2)mousePosition, 1);
points.SetValue(polygonCollider2D.points[2]   (Vector2)mousePosition, 2);
points.SetValue(polygonCollider2D.points[3]   (Vector2)mousePosition, 3);
polygonCollider2D.points = points;
  

Настройка фильтра контактов:

 ContactFilter2D contactFilter2D = new ContactFilter2D();
contactFilter2D.useTriggers = true;
contactFilter2D.SetLayerMask(polygonCollider2D.gameObject.layer);
  

Проверка на наличие коллизий

 List<Collider2D> list = new List<Collider2D>();
Debug.Log(polygonCollider2D.OverlapCollider(contactFilter2D, list));
  

Однако, если там уже есть здание, оно все равно не регистрирует перекрытие.
Чего я не понимаю / делаю неправильно?

Большое спасибо за помощь!

Ответ №1:

Похоже, что проблема заключается в вашем коде, который устанавливает точки полигонального коллайдера. Если этот код выполняется несколько раз, он будет многократно смещать коллайдер все дальше и дальше от его исходного положения. Вероятно, вы не хотите менять фактический коллайдер; обычно вам следует переместить объект, у которого есть коллайдер. Итак, вы бы заменили эти строки чем-то вроде этого:

 gameObject.transform.position = mousePosition;
  

Комментарии:

1. Способ, которым я это установил, заключается в том, что фактический объект не создается во время проверки. Я беру коллайдер объекта из сборного и пытаюсь проверить размещение. Только если размещение допустимо, объект будет размещен. Я должен упомянуть, что код для установки точек полигонального коллайдера запускается только при нажатии кнопки мыши, а не несколько раз.

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