【问题标题】:OnTriggerEnter2D and OnTriggerExit2D called mutiples time多次调用 OnTriggerEnter2D 和 OnTriggerExit2D
【发布时间】:2020-03-16 13:38:53
【问题描述】:

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

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

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

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

这是我的球员和支柱

如果你有什么建议,请告诉我。

谢谢。

【问题讨论】:

    标签: unity3d rigid-bodies


    【解决方案1】:

    来自RigidbodyType2D.Static 文档:

    静态行为阻止 Rigidbody2D 对重力或 施加的力,包括与任何其他 Rigidbody2D 的接触。

    这种类型的 Rigidbody2D 永远不应该明确地重新定位。这是 设计为永不移动。

    静态 Rigidbody2D 只会与动态 Rigidbody2D 实体发生碰撞 类型。例外情况是 Rigidbody2D.useFullKinematicContacts 设置为 true 在这种情况下它也会与任何 [[Kinematic]] 身体类型。

    当附加的 Collider2D 设置为触发时,它总是会产生 附加到 [[Dynamic]] 或 [[Kinematic]] 的任何 Collider2D 的触发器 体型。

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

    【讨论】:

    • 感谢您的评论,您有什么方法可以将播放器粘在墙上吗?
    • 不客气,如果您认为此答案为“正确”,请标记它。关于你的第二个问题:有很多方法,其中一些比其他更简单,比如将gravityScale更改为0。但通常取决于你如何控制角色移动等
    • 感谢您的帮助,我会尝试使用gravityScale。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多