[ 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(組件)資訊



相關文章

基礎教學 #01 – 前置作業 ---Unity 多人連線 UNet 教學 #01--- 為了教學上的方便,在UNet系列教學文中會使用2D專案做展示,會以讓大家「快速入門」為主要目標 在開始寫Code之前,我們必須先了解Uni...
教學 #03 – 位置、旋轉、縮放 上一篇文提到了Transform以及基本的移動,但是沒有把Transform講清楚 在Transform中有三個最重要的資訊,分別是位置(Position)、旋轉(Rotation)、縮放(S...
教學 #13 – Camera(攝影機) 攝影機是遊戲中最重要的一項遊戲物件,它決定了玩家畫面中所能看見的遊戲畫面 在每一個新的場景(Scene)中一定會預設一個Main Camera,其意思就是「主要攝影機」,點擊Main C...
教學 #04 – 滑鼠事件、鍵盤事件 Unity中事件被簡化的十分方便,如同Start()與Update()一樣只要打上函數名稱就可以了。 滑鼠的相關事件中較常用的有以下幾種: OnMouseDown - 滑鼠點擊事...