Обнаружение столкновений в unity без фактического применения силы к объекту

#c# #unity3d

#c# #unity3d

Вопрос:

Эй, итак, я создаю 2d-игру, которая очень похожа на flappy bird (вы прыгаете при нажатии на экран). Смысл игры состоит в том, чтобы поймать зеленые квадраты, идущие к вам.


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


В сборке player есть компонент rigidbody и 2d-квадратный коллайдер.
К сборке green square подключен только компонент 2d square collider.


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


Вот настройки жесткого тела игрока и 2d-коллайдера


Вот настройки 2D-коллайдера green square


Возможно, эта картина игрового процесса может помочь. Представьте, что синий квадрат — это игрок, а зеленые квадраты — это точки, которые вы должны поразить, красные вещи — это просто враги, которые убивают вас, поэтому не обращайте на них внимания. Игрок стоит на месте, а к сборному элементу green square прикреплен скрипт, который добавляет к ним постоянную силу. Надеюсь, это сделало его намного понятнее.

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

1. должны ли зеленые элементы физически сталкиваться друг с другом или с чем-то еще? Если нет, вы могли бы использовать триггеры «Коллайдер, настроенный как триггер (с использованием свойства Is Trigger), не ведет себя как сплошной объект и просто позволяет другим коллайдерам проходить».

2. Можете ли вы предоставить скриншоты конфигурации ваших игровых объектов, в основном жесткого тела и квадратного коллайдера?

3. Хорошо, чтобы сделать вещи немного более понятными, к зеленым предметам прикладывается постоянная сила, чтобы переместиться к игроку со стороны экрана. Они взаимодействуют только с игроком, а не друг с другом или другими игровыми объектами.

Ответ №1:

Существует действительно полезная функция Unity, которая определяет, когда коллайдер касается другого коллайдера.
Это: void OnCollisionEnter(...)

Вы также должны передать Collider или Collider2d . Таким образом, это будет выглядеть:

  • void OnCollisionEnter(Collider col)
  • или void OnCollisionEnter(Collider2D col)

Конечно, у вас также должны быть необходимые инструкции импорта для движка Unity вверху.

Ответ №2:

Возможно, вы захотите использовать триггер для своих зеленых квадратов. тогда bird разрешено передавать true, но square активирует ваш код OnTriggerEnter в вашем скрипте.

итак, что вы можете попробовать, это:

     public void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
            {
            //Run your code here!!!
            //for example
             Rigidbody rb = other.gameObject.GetComponent<Rigidbody>();
            rb.AddForce(new Vector3(1, 1, 1));
            }
    }
  

это добавит силы вашему игроку / птице. но вы можете запустить любой код в этом методе.

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

1. Эй, я все еще не совсем понимаю разницу между OnTriggerEnter и OnCollisionEnter, не могли бы вы, пожалуйста, объяснить это мне. В моем коде я использовал OnCollisionEnter.

2. @Tudoraster Можете ли вы поделиться кодом? Трудно обеспечить достойное решение вашей проблемы, не видя код, в котором есть проблема.

Ответ №3:

OnTriggerEnter и OnCollisionEnter запускаются оба, когда объект сталкивается с жестким телом. но с помощью OnTriggerEnter вы можете проходить через объект. потому что на него не влияют другие физические объекты. но OnCollision обычно срабатывает, если вы не фиксируете его на месте.

примечание OnTriggerEnter выполняется в FixedUpdate, поэтому он запускается в конце каждого кадра

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

1. Спасибо, и если я проверю флажок триггера is на коллайдере, это означает, что я должен использовать функцию OnTriggerEnter правильно?

2. ДА. если вы проверите isTrigger, он запускается OnTriggerEnter.

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