Четверг, 03 Октября 2024, 14:52

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Проверка НЕ столкновения
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 сработало, спасибо;)

Карсон и Питееерс!!!
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг