2017-05-13 25 views
1

enter image description here团结 - 盒对撞机无法正常

工作我有2对撞机(绿框),并在我的场景一球。每当球触及较大的对撞机时,球员死亡,游戏结束。但是,如果球位于较小的对撞机上(如图中所示),则球员状态良好,游戏继续运行。

问题

当我从高处落下的球,有时球设法接触到更大的对撞机(的可能是因为它的动量)和我的玩家死亡。正如我所说,这并不总是发生,这导致了不可预测的结果。

我做了什么来解决这个问题

我说rb2d.velocity = Vector2.zero;尽快将其与小Collider碰撞停球。但它没有奏效。

灯光是与Game Object相关的tag,该对象上附有较小的Box Collider。

private void OnCollisionEnter2D(Collision2D collision) 
    { 
     if (collision.gameObject.CompareTag("light")) 
     { 

      Debug.Log("collision"); 
      rb2d.velocity = Vector2.zero; 
      return; 
     } 
     // Zero out the ball's velocity 
     rb2d.velocity = Vector2.zero; 

     Debug.Log("gameovercollision"); 
     // If the ball collides with something set it to dead... 
     isDead = true; 
     //...and tell the game control about it. 
     GameController.instance.PlayerDied(); 
    } 

我甚至试图从同一高度释放球,但仍然是,行为是不可预知的。

原木

gameovercollision UnityEngine.Debug:日志(对象) 球:OnCollisionEnter2D(Collision2D)(在资产/脚本/ Ball.cs:63)

碰撞
UnityEngine.Debug:Log(Object) Ball:OnCollisionEnter2D(Collision2D)(At Assets/Scripts/Ball.cs:54)

  • 这是什么原因?

  • 为什么较小的对撞机不能完美地停止球?

  • 我该如何解决这个问题?

回答

0

很可能是因为球的速度足够高,足以在单个固定时间步后进入两个碰撞体。

尝试减小项目设置 - >时间下的Fixed Timestep值和/或将球的刚体2D的Collision Detection字段设置为Continuous

+0

首先,谢谢你的回答。我刚开始学习团结,所以我想弄明白Unity在事情上是如何工作的。那么,为什么较小的“Box Collider”会停止球(因为它位于较大的Collider之上)?日志也显示球首先接触到较大的对撞机,然后是较小的碰撞体。这怎么可能?较小的对撞机在上面所以,球首先应该接触较小的一个。 – rayan

+0

以及如何减少固定时间步长解决问题。 – rayan