多次调用 OnTriggerEnter2D 和 OnTriggerExit2D

OnTriggerEnter2D and OnTriggerExit2D called mutiples time

我有一个 RigidBody2D 的玩家和一个 BoxCollider2D 的柱子。

我检查何时调用 OnTriggerEnter2D(玩家与柱子相撞),然后我尝试通过将他的 bodyType 更改为 Static 来保持玩家的位置。

调用OnTriggerExit2D时,播放器bodyType将再次恢复为Dynamic

我的问题是:将播放器 bodyType 更改为 Static 后,立即调用 OnTriggerExit2D 。恢复为 Dynamic 后,立即调用 OnTriggerEnter2D。它一次又一次地重复。

这是我的球员和支柱

有什么建议请告诉我。

谢谢。

来自 RigidbodyType2D.Static 文档:

Static behaviour stops the Rigidbody2D from reacting to gravity or applied forces including contacts with any other Rigidbody2D.

This type of Rigidbody2D should never repositioned explicitly. It is designed to never move.

A static Rigidbody2D will only collide with a dynamic Rigidbody2D body type. The exception to this is if Rigidbody2D.useFullKinematicContacts is set to true in which case it will also collide with any [[Kinematic]] body types.

When an attached Collider2D is set to trigger, it will always produce a trigger for any Collider2D attached to [[Dynamic]] or [[Kinematic]] body types.

这就是出口再次被触发的原因,如果你想让你的角色粘在墙上,你应该采取不同的方法。

我对这个问题的解决方案改为使用约束。 我采用的方法是在触发 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;
     }
 }