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



相關文章

教學 #12 – Layer(層級) 另一個與Tag很像的東西叫做Layer,是層級、階層的意思,在Unity中與Tag有同樣的功能,但是Layer會牽扯到碰撞判定。 Layer的設定方式與Tag一致,位置就在Tag的右邊而已 ...
遊戲程式入門 #03 印出訊息,Debug Log、print... 在先前的 #00 Unity腳本建立與HelloWorld! 中有提到 Debug.Log 這個函式,這是用來印出除錯訊息的功能 每個語言都會有類似的功能,用來幫助開發者在開發時進行除錯,或是...
教學 #04 – 滑鼠事件、鍵盤事件 Unity中事件被簡化的十分方便,如同Start()與Update()一樣只要打上函數名稱就可以了。 滑鼠的相關事件中較常用的有以下幾種: OnMouseDown - 滑鼠點擊事...
遊戲程式入門 #02 變數宣告與資料型態 何謂變數?變數是在程式語言中的基本概念之一,從字面上解釋就是「可變動的數」,用來作為存放資料的一個載體,存放資料的類型則是依據「資料型態」來定義。   宣告變數的程式碼如下: ...