2014-09-30 44 views
1

,顯示了碰撞不一致GIF格式:http://imgur.com/QB4XOv0.gifOnTriggerEnter2D不叫一貫

在我Unity2D比賽,我有一個彈弓(玩家)發射彈珠了一堵牆(認爲Puzzle Bobble型益智射擊遊戲)。每個彈珠是克隆預製的每個預製有剛體IsKinematicOnTrigger檢查與CircleCollider一起檢查。

當大理石與兩個側壁碰撞時,我使用OnTriggerEnter2D()並旋轉角度使其以一定角度從牆壁反彈。當大理石與頂壁發生碰撞時,它基本上會凍結,此時我將零部件去除,並設置一個標記「01212」。

當大理石與另一塊大理石碰撞時會出現不一致。有時會調用觸發器函數,有時則不會。觸發器似乎是隨機的和不可預知的。

這裏是(附着在大理石),用於檢測碰撞,並與它一起去的行爲,我的C#代碼:

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class RockMove : MonoBehaviour 
{ 
    public float speed = 0.5f; 
    private Vector2 direction = new Vector2(0, 1); 

    // current angle 
    private float currentAngleZ; 
    // indendiary angle 
    private float angleB; 

    // rotation speed 
    private float rot; 

    // curving speed 
    private float rotMod; 

    // stops marble when collides with wall 
    private bool IsMoving = true; 


    void Start() { 
    } 

    void Update() 
    { 

     if (IsMoving) { 
      rot = RockSpawn.rot; 

      currentAngleZ = transform.eulerAngles.z; 

      rotMod = transform.position.x * -0.5f; 
      // moves it forward + adds speed 
      transform.Translate(direction * Time.deltaTime * speed, Space.Self); 
      // curving 
      transform.Rotate (0, 0, rotMod, Space.Self); 
      if (transform.position.x >= 0) { 
       // faster speed when near walls "gravity/magnetism" 
       speed += transform.position.x * 8 * Time.deltaTime; 
      } 
      if (transform.position.x < 0) { 
       // faster speed when near walls "gravity/magnetism" 
       speed += transform.position.x * -8 * Time.deltaTime; 
      } 
     } 
     else { 
      // when object is stationary 
      speed = 0; 
     } 
    } 


    void OnTriggerEnter2D(Collider2D collider){ 

     // if collides with another marble 

     if (collider.gameObject.tag == "topObjects") { 
      // get rid of rigidbody 
      // can't have 2 rigidbodies when 2 objects collide 
      Destroy(rigidbody2D); 
      // freeze movement 
      IsMoving = false; 

      Debug.Log ("you collided with a marble"); 

      // freeze rotation 
      this.transform.Rotate (0, 0, 0, Space.Self); 

      // assign the new tag 
      this.tag = "topObjects"; 
     } 
     else if(collider.name == "TopWall") 
     { 
      Destroy(rigidbody2D); 
      IsMoving = false; 

      Debug.Log ("you broke the fourth wall!"); 
      transform.Rotate (0, 0, 0); 

      this.tag = "topObjects"; 
     } 
     else { 
      // bounce off walls 
      currentAngleZ = transform.eulerAngles.z; 
      angleB = 360 - (2 * currentAngleZ); 
      transform.Rotate (0, 0, angleB); 
     } 
    } 

} 

更新:簡單地改變更新()函數來FixedUpdate()似乎使觸發器更加一致,但是它們如何被檢測到仍然存在不一致。

我測試了rigidbody2d.velocity,transform.position和其他各種變換函數,但是Transform.Translate產生了最好的效果,即使它理論上只是傳送對象到一個新的位置。

降低速度也不會影響一致性,也不會改變圓形碰撞體的大小。

+0

以我的經驗,碰撞和觸發事件在使用基於物理的運動時更加一致,例如'rigidbody.velocity'。 – SirBraneDamuj 2014-09-30 19:12:34

+0

我認爲問題與你的牆壁有關。當氣泡在牆上反彈時,您的gif只顯示碰撞不一致。你的牆被設置爲觸發器還是隻是常規的對撞機? – SirBraneDamuj 2014-10-01 13:41:02

+0

牆壁也設置爲觸發器(選中與IsTrigger相對的多邊形對撞機) – BankBits 2014-10-01 13:44:08

回答

0

無論您是否使用物理,OnTriggerEnter2D都應該一致地工作。然而,如果一個遊戲對象與另一個遊戲對象保持聯繫,那麼你只會將OnTriggerEnter標記一次,這是他們碰撞的第一個時刻。之後,您可以通過調用OnTriggerStay獲知兩個gameObjects是否仍然發生碰撞。

然後,在他們停止碰撞後,OnTriggerEnter將重置,並在與其他gameObject聯繫時再次觸發,即使其與之前碰撞的相同。你檢查過了嗎?

希望它有幫助,我會發表評論,但我沒有足夠的聲望點,所以不得不作爲回答發佈,如果我不應該。

+0

謝謝你,我會試試OnTriggerStay並讓你知道它是否有效。 – BankBits 2014-09-30 20:58:53

+0

嗯,不是說你應該使用OnTriggerStay(),而只是爲了讓它發生這種情況,以防萬一它可能有幫助。 – CodeAssembler 2014-10-02 16:08:48

0

這裏有兩件很明顯的事情:

1。)你的遊戲對象有Rigidbody2D,所以你不應該通過變換,而是通過與剛體運動功能像:

rigidbody2D.MovePosition() 

rigidbody2D.MoveRotation() 

只要看看他們,在統一的文檔。

2)把所有這一切到

void FixedUpdate() 
{ 
    ... 
} 

這是關於物理引擎一切順利英寸 也有大量的在線資源,以瞭解它:)

+0

我嘗試了Rigidbody2d.MovePosition()和MoveRotation(),但它只能成功地將大理石部分移動到屏幕上,然後完全停止。我檢查了一下,在那個時候沒有其他的對撞機,所以它似乎停止任意。將OnTriggerEnter更改爲OnTriggerStay也沒有解決問題,也沒有將轉換代碼移到FixedUpdate()。 – BankBits 2014-10-01 07:21:09

+0

MovePosition在絕對位置工作。這意味着如果你想向上移動,你必須使用rigidbody2D.MovePosition(rigidbody2D.position + Vector2.up); – Tom 2014-10-02 00:17:44

-2

這是我的理解是運動RigidBody不能在2D中發生碰撞。我還是很新的,但是我發現了一些有我自己的問題的答案。你應該更多地研究它。