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



相關文章

基礎教學 #06 – Spawn 卵生 在UNet中若要用程式碼生成物件,必須先和平常一樣用Instantiate生成物件,在透過「NetworkServer.Spawn」這個功能卵生到Client端。 也就是將一個存在於Se...
基礎教學 #05 – ClientRpc 遠端呼叫客戶端... ClientRpc是與Command相對的功能,是由「Server」去要求「Client」執行,兩者的撰寫方式是差不多的,只需要在函式前加上,不過函式名稱必須是「Rpc」開頭。 首先我先...
教學 #00 – 安裝與事前準備 Unity是目前主流的開發引擎之一,他強大的地方在於免費提供給開發者使用,並且有良好的跨平台發行能力。雖然Unreal 現在也開放免費使用,但Unity先進入市場,使得網路上有大量參考資料,非常適合新...
基礎教學 #01 – 前置作業 ---Unity 多人連線 UNet 教學 #01--- 為了教學上的方便,在UNet系列教學文中會使用2D專案做展示,會以讓大家「快速入門」為主要目標 在開始寫Code之前,我們必須先了解Uni...