Коллайдер 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
Благодарю.
Как показывает код, преобразование контролируется вами, в то время как непрерывное обнаружение требует управления физическим движком, поэтому попробуйте управлять игровым объектом с физическим движком, вместо этого присвойте ему позицию, измененную вашим собственным кодом.