Коллайдер Unity время от времени проходит через другие коллайдеры?

Я пытаюсь создать клон Pong для практики. Я настраиваю свой проект в 2D.

Весло состоит из следующих компонентов:

  • -Rigidbody2D (установлен на kinematic)
  • -BoxCollider2D (это trigger)

Мяч состоит из следующих компонентов:

  • -Rigidbody2D (установлен на kinematic)
  • -CircleCollider2D (это trigger)

Веслом управляет перетаскивание (пользователь перемещает палец по экрану влево / вправо). Я использовал для этого плагин EasyTouch.

Затем я перемещаю мяч с помощью этого скрипта:

void Update () {
        transform.position += new Vector3(xSpeed * Time.deltaTime, ySpeed * Time.deltaTime);
    }

Вот как я обнаруживаю столкновения и перенаправляю мяч, когда он что-то ударяет (горизонтальные объекты - это верх / низ / весло, а вертикальные объекты - это левая / правая граница экрана):

void OnTriggerEnter2D(Collider2D c)
    {
        if(c.gameObject.tag.Equals("Horizontal"))
        {
            ySpeed *= -1;
        }
        else if(c.gameObject.tag.Equals("Vertical"))
        {
            xSpeed *= -1;
        }

    }

Проблема в том, что иногда мяч проходит через ракетку, что может показаться конечному пользователю некорректным. Я искал об этом в Интернете и попытался установить свойство жесткости Collision Detection на Continuous вместо Discrete. Но в определенные моменты мяч все равно проходит через ракетку.

Кто-нибудь знает, как это решить? Что я делаю не так с настройкой / программированием игры?

Спасибо


person aresz    schedule 03.05.2016    source источник
comment
В физическом движке это не проблема, потому что вы не используете физику. Добавьте несколько журналов отладки для проверки того, что происходит, когда ваш мяч глючит   -  person Rafiwui    schedule 03.05.2016
comment
Забавно, как люди предполагают, что скорее всего виновато его единство, чем их. почему бы вам не поискать в учебнике по понгу единство, их много, и это займет всего час или два, но вы избавите себя от многих разочарований, если знаете, как все работает, прежде чем пробовать свои собственные идеи. пожалуйста, не воспринимайте это как оскорбление, даже если вначале я был немного саркастичен :)   -  person yes    schedule 03.05.2016
comment
Спасибо обоим за совет. Да, я продолжу обучение и освежу знания. Я давно не касался разработчиков игр и Unity. Я снова чувствую себя новичком: P   -  person aresz    schedule 04.05.2016


Ответы (2)


У вас очень простая концептуальная ошибка. OnTriggerEnter2D (Collider2D) - получить, если коллайдер вошел в другой коллайдер. Другими словами, вы можете пройти сквозь объект.

вместо этого вам нужно использовать эту функцию:

OnCollisionEnter2D(Collision2D coll)

Я предлагаю вам посмотреть это руководство по Unity, потому что оно действительно хорошо объясняет все это: https://unity3d.com/learn/tutorials/modules/beginner/physics/colliders

Дополнительная информация: http://docs.unity3d.com/ScriptReference/Collider2D.html

Спасибо.

person Cabrra    schedule 03.05.2016
comment
Когда я увидел ваш пост, я понял, что это должен быть OnCollisionEnter, а не OnTriggerEnter, исходя из моих потребностей. Ошибка новичка с моей стороны. Я продолжу с уроками, которыми вы поделились! Спасибо! - person aresz; 04.05.2016

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

person RickShao    schedule 03.05.2016
comment
Спасибо за это. Я попытался оставить поведение движения физическому движку, и он больше не проходит через коллайдеры, что хорошо. Однако создаваемое движение - это не то, что я хочу для игры в понг. Я пойду и посмотрю несколько руководств по этому поводу - person aresz; 04.05.2016