快速連結

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

沒有留言:

張貼留言

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