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

Я пытаюсь создать клон Понг для практики. Я настраиваю свой проект в 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, Но мяч все еще проходит через весло в определенные моменты времени.

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

Спасибо

2 ответа

Решение

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

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

OnCollisionEnter2D(Collision2D coll)

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

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

Благодарю.

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

Другие вопросы по тегам