[ Unity 2D ] 教學 #08 – 碰撞事件

Unity的碰撞事件與滑鼠點擊事件是差不多的撰寫方式,一樣是在腳本中打上函數名稱就能夠使用事件。

事件主要分成兩大類:

  • OnCollision – 碰撞事件
  • OnTrigger – 觸發事件

如同上篇教學文所說的碰撞器與觸發器的差別,在事件上兩著也是分開運行的,且碰撞世界也分為2D與3D。

OnCollision 碰撞事件–

  • 發生條件:
    • 當兩個非觸發區(Is Trigger未勾選)的物件碰撞,且一方帶有Rigidbody(剛體),就會發生Collision事件。
  • 事件類型:
    • OnCollisionEnter2D – 碰撞事件
      • 當兩個2D碰撞器碰撞時會發生的事件
    • OnCollisionExit2D – 分開事件
      • 當兩個2D碰撞器碰撞後,分開時所發生的事件
    • OnCollisionStay2D – 停滯事件
      • 當兩個2D碰撞器碰撞後,未分開時會持續發生的事件,也可以想做是接觸著碰撞器

使用時的程式碼如下:

void OnCollisionEnter2D()
{
  print("A"); //碰到碰撞器時印出"A"
}
void OnCollisionExit2D()
{
  print("B"); //離開碰撞器時印出"B"
}
void OnCollisionStay2D()
{
  print("C"); //接觸著碰撞器時印出"C"
}

運行畫面如下

Unity 碰撞

OnCollision事件都可以帶有一個參數,這個參數是碰撞到的對象的Collision2D(碰撞資訊)

void OnCollisionEnter2D(Collision2D Coll)
{
   print("A:" + Coll.gameObject.name); //印出A:碰撞對象的名字
}
void OnCollisionExit2D(Collision2D Coll)
{
   print("B:" + Coll.gameObject.name); //印出B:碰撞對象的名字
}
void OnCollisionStay2D(Collision2D Coll)
{
   print("C:" + Coll.gameObject.name); //印出C:碰撞對象的名字
}

執行後畫面如下

Unity 碰撞

碰撞事件可以藉由參數Collision2D來獲取碰撞物件的訊息,例如可以判斷對象是不是敵人、是不是某種物體,藉此來設計條件式。

OnTrigger 觸發事件–

  • 發生條件:
    • 當觸發區(Is Trigger)碰觸到其他碰撞體(或觸發區)時,且一方帶有剛體時,就會觸發Trigger事件
  • 事件類型:
    • OnTriggerEnter2D – 觸發事件
      • 當一個觸發區與一個碰撞體(或觸發區)觸碰時會發生
    • OnTriggerExit2D – 分開事件
      • 當一個觸發區與一個碰撞體(或觸發區)觸碰後離開時會發生
    • OnTriggerStay2D – 停滯事件
      • 當一個觸發區與一個碰撞體(或觸發區)觸碰後,未離開觸發區時會持續發生

使用時的程式碼如下:

void OnTriggerEnter2D(Collider2D Coll)
{
   print("Trigger - A");
}
void OnTriggerExit2D(Collider2D Coll)
{
   print("Trigger - B");
}
void OnTriggerStay2D(Collider2D Coll)
{
   print("Trigger - C");
}

實際運行結果如下:

由於是Trigger,物件會穿過觸發區掉下去,並觸發Trigger事件

Trigger可以帶有Collider2D參數,用來抓取碰撞對象的碰撞體,由於碰撞區不會產生碰撞,故不像OnCollision事件是使用Collision2D(碰撞資訊)

void OnTriggerEnter2D(Collider2D Coll)
{
    print("Trigger - A:" + Coll.gameObject.name) ; 
    //使用方式與OnCollision幾乎一致,印出Trigger - A:碰撞物件的名字
}

事實上,OnCollision與OnTrigger在程式撰寫上幾乎沒有差別,最大的差異在於Trigger並不會發生「碰撞」,也就是物件可以穿透過Trigger,這也是Trigger很重要的原因之一。

要注意的是,OnCollisionOnTrigger在一次碰撞中是不可能同時發生的,因為Trigger不發生碰撞,碰撞體不是Trigger,但是可以A跟B發生OnCollision,同時A跟C發生OnTrigger

OnCollisionOnTrigger的使用上不需要做太多的思考,需要的碰撞是有物理效果的就用OnCollision(如推箱子,接觸地面等等),反之不需要碰撞的就是用OnTrigger(如子彈貫穿、站在觸發區內),發生的條件也不需太多顧慮,只要一方帶有剛體基本上就沒問題,要不然大家都塞上剛體也是可以的,只要將Is Kinematic(運動學)勾選,剛體的物理效果就會消失,不會受到重力影響,與未放上剛體時是沒差的。

[ Unity 2D ] 教學 #09 – 獲取Component(組件)資訊

One Thought to “[ Unity 2D ] 教學 #08 – 碰撞事件”

  1. Sky

    您的文章內容很好,但是時常被瘋狂開分頁的詐騙廣告阻擋進入。

Leave a Comment