快速連結

2015年10月7日

OnTrigger與OnCollision的時機

Script內需要利用碰撞、觸發時,該物件內一定要掛載Collider元件,但是有沒有勾選Trigger會造成不同的狀況。

沒有Trigger的狀況下,當物體之間碰到彼此Collider的表面時,便會觸發彼此的OnCollisionEnter事件,且兩物體至少要有一個有Rigidbody。
有Trigger的狀況下,當A物體進入B物體的Collider範圍內的瞬間,便會觸發B物體的OnTriggerEnter事件。

但是物體的parent上加入Rigidbody後,事情會變得更加複雜些。




現在場面上我們有五個物體,其中可以動的為球體。


我額外寫了一個判斷Script:EventTrigger.cs(別問我為什麼要用這個命名),判斷是OnCollision還是OnTrigger。

EventTrigger.cs


public UnityEvent TriggerEvent = new UnityEvent();

void OnCollisionEnter(Collision Other)
{
   Debug.Log("Collision : " + this.gameObject.name + " Get>> " + Other.gameObject.name);
}

void OnTriggerEnter(Collider Other)
{
   Debug.Log("Trigger : " + this.gameObject.name + " Get>> " + Other.gameObject.name);
   TriggerEvent.Invoke();
}

Player身上也掛著Rigidbody與Collider與判斷Script。


第一個物件自己就掛載Rigidbody與Collider,但是沒有Trigger類型的Collider。當然掛著判斷Script。


結果

Collision : RigibodyCCube Get>> Player

Collision : Player Get>> RigibodyCCube


第二個,母物件掛著Rigidbody與判斷Script。
子物件分別是掛著Renderer與Collider的實體、以及包含Trigger Collider的物體。




結果

Trigger : Player Get>> PTrigger

Trigger : RigibodyPCube Get>> Collider (Player的Collider)

Collision : RigibodyPCube Get>> Player

Collision : Player Get>> RigibodyPCube


第三個,母物件掛著Rigidbody與判斷Script。
子物件分別是掛著Renderer與Collider的實體。


還有一個是有Trigger Collider、有判斷Script、有Trigger成功後呼叫的Event!


結果

Trigger : PTrigger (1) Get>> Collider

PTrigger (1) Show Log!

Trigger : Player Get>> PTrigger (1)

Trigger : RigibodyPCube (1) Get>> Collider

Collision : Player Get>> RigibodyPCube (1)

Collision : RigibodyPCube (1) Get>> Player


第四個,母物件沒有任何多餘元件。


子物件一:掛著Renderer與Collider的實體、還有判斷Script。


子物件二:掛著Trigger Collider、還有判斷Script。


結果

Trigger : CCTrigger Get>> Collider

Trigger : Player Get>> CCTrigger

Collision : Player Get>> CCCube

Collision : CCCube Get>> Player


接下來我們在第三個物件的裡面又加上一個名為Flower的子物件。
Flower上掛著Rigidbody,裡面又有一個實體物,還有一個GameObject內掛著三個東西:Trigger Collider、有判斷Script、有Trigger成功後呼叫的Event!
Trigger Collider位置如同綠色框所示。



結果

Trigger : FlowerTrigger Get>> Collider

FlowerTrigger Show Log !

Trigger : Player Get>> FlowerTrigger

2 則留言:

  1. 不好意思,我想請問,如果我想要讓子物件吃到母物件的OnCollsionEenter()是可能的嗎?
    目前只知道是觸發掛上這個程式的物件才會觸發這段程式碼

    回覆刪除
    回覆
    1. 請問你是指子物件掛著有OnCollisionEnter function的script嗎?
      如果是這樣,子物件與子物件以下有掛Collider才會觸發OnCollisionEnter喔~

      刪除

歡迎大家留言提問,我會答的都會盡力回答!
如果太久沒出現回應就是我又忘記回來看留言了TAT