OnTriggerEnter2D и OnTriggerExit2D вызвали многократное время - PullRequest
1 голос
/ 16 марта 2020

У меня есть один игрок с RigidBody2D и столб с BoxCollider2D.

Я проверяю, когда вызывается OnTriggerEnter2D (игрок столкнулся с столпом), затем я пытаюсь сохранить позицию игрока, изменив его bodyType до Static.

Когда вызывается OnTriggerExit2D, игрок bodyType снова будет возвращен к Dynamic.

Моя проблема: после смены игрока bodyType на Static, OnTriggerExit2D называется сразу. И после возврата к Dynamic, немедленно вызывается OnTriggerEnter2D. Это повторяется снова и снова.

Это мой игрок и столп

enter image description here

Если у вас есть какие-либо предложения, пожалуйста, скажите мне.

Спасибо .

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Из документов RigidbodyType2D.Static:

Stati c не позволяет Rigidbody2D реагировать на гравитацию или приложенные силы, включая контакты с любым другим Rigidbody2D.

Этот тип Rigidbody2D никогда не должен перемещаться явно. Он разработан так, чтобы никогда не двигаться.

Состояние c Rigidbody2D будет сталкиваться только с динамическим типом тела c Rigidbody2D. Исключением является случай, если для Rigidbody2D.useFullKinematicContacts задано значение true, и в этом случае он также будет конфликтовать с любыми типами телосложения [[Kinematic]].

Когда подключенный Collider2D настроен на запуск, он всегда будет генерировать триггер для любого Collider2D, прикрепленного к типам телосложения [[Dynamic]] или [[Kinematic]].

Вот почему выход срабатывает снова, если вы хотите, чтобы ваш персонаж прилипал к стене, вам следует это сделать. другой подход.

0 голосов
/ 17 марта 2020

Мое решение для этой проблемы изменено, чтобы использовать ограничения. Я подошел к нему так, чтобы при каждом срабатывании OnCollisionEnter () замораживать позиции X и Y, а также поворот Z.

void OnCollisionEnter2D(Collision2D collison){
     if(collison.transform.tag -= "Player"){
             body.constraints = RigidbodyConstraints2D.FreezePositionY | RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezeRotation;
     } 
}

void OnCollisionExit2D(Collision2D collision){
     if(collision.transform.tag == "Player"){
         body.constraints = RigidbodyConstraints2D.None;
     }
 }
...