Проверка НЕ столкновения
|
|
ASH2 | Дата: Воскресенье, 29 Января 2017, 12:50 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Наткнулся на такую проблему. Например, нужно произвести какое-то действие с объектом, у которого коллайдер IsTrigger только если у него нет столкновений с другими объектами. Как это проверить? Пробовал сделать переменную bool , которая бы ставилась в false при коллизии и скидывалась в true в LateUpdate, а в Update производить требуемые операции с проверкой на это bool - не пашет. Может кто знает, как решить?
В принципе, была мысль вызывать метод OnTriggerStay в Update до операции, но тогда что передавать ему в качестве параметра Collider2D?
P.s. Да, я в курсе, что уже была подобная тема, но там товарищ решил использовать метод OnTriggerExit, что вот вообще не то.
Карсон и Питееерс!!!
Сообщение отредактировал ASH2 - Воскресенье, 29 Января 2017, 13:05 |
|
| |
XanKriegor | Дата: Воскресенье, 29 Января 2017, 13:41 | Сообщение # 2 |
участник
Сейчас нет на сайте
| ASH2, Попробуй создать массив, в который добавляй объекты, с которыми сталкивается триггер. Через OnTriggerExit объекты удаляй. If (ТвойМассив.lenght == 0) и всё.
|
|
| |
ASH2 | Дата: Воскресенье, 29 Января 2017, 13:54 | Сообщение # 3 |
участник
Сейчас нет на сайте
| XanKriegor, спасибо за совет, и да, честно говоря, была идея так и реализовать,но мне показалось, что это как-то слишком попахивает каких-то костылём... Я думал, что есть более простой способ. В смысле, это ж вроде совершенно банальная операция чтобы, например не заспавнить объект на другом объекте.
В любом случае, спасибо, но, если кто-то знает другой способ - дайте знать.
Карсон и Питееерс!!!
|
|
| |
Rean | Дата: Воскресенье, 29 Января 2017, 14:27 | Сообщение # 4 |
участник
Сейчас нет на сайте
| ASH2, вполне должно быть достаточно флаг-переменной, установленной в событии коллизии (триггера). 2D или 3D используешь? Коллайдеры и события должны быть соответствующие. "Обнулять" флаг достаточно в конце Update'а (LateUpdate для этих целей не нужен).
|
|
| |
XanKriegor | Дата: Воскресенье, 29 Января 2017, 14:31 | Сообщение # 5 |
участник
Сейчас нет на сайте
| Код public int variable = 0; void Update () { if (variable == 0) { Debug.Log ("shit"); } } void OnTriggerEnter () { variable++; } void OnTriggerExit () { variable--; } } Или так
|
|
| |
ASH2 | Дата: Воскресенье, 29 Января 2017, 20:02 | Сообщение # 6 |
участник
Сейчас нет на сайте
| Rean, да вроде понимаю, что должно работать, но что-то нифига...
Если сокращённо, код:
Код public bool free = true;
private void OnTriggerStay2D(Collider2D collision) { free = false; }
void Update () { if (free) { делай всякую хрень } free = true; }
Работаю, соответственно, с 2D. Код в объекте, который с is Trigger. Тестирую с объектами, которые без is Trigger. Пролетает. Пробовал FixedUpdate. Так же пролетает
Карсон и Питееерс!!!
|
|
| |
Rean | Дата: Воскресенье, 29 Января 2017, 20:06 | Сообщение # 7 |
участник
Сейчас нет на сайте
| ASH2, на движимом объекте обязательно должен стоять Rigidbody2D с включенной симуляцией. Для того, чтобы всегда срабатывал OnTriggerStay2D, нужно режим сна у Rigidbody2D установить в Never Sleep, либо использовать конструкцию, которую описал XanKriegor. У тому же, движение физических объектов желательно производить в FixedUpdate и через компонент RigidBody2D. Если делать движение через transform, то при быстром перемещении будут "пролёты" - не будет фиксироваться коллизия.
Сообщение отредактировал Rean - Воскресенье, 29 Января 2017, 20:09 |
|
| |
ASH2 | Дата: Воскресенье, 29 Января 2017, 20:15 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Rean, c Never Sleep сработало, спасибо;)
Карсон и Питееерс!!!
|
|
| |