前言
這篇文章將會介紹 Unity 中關於物理碰撞與偵測事件,如何使用程式腳本撰寫相關的程式來控制遊戲物件,這是學習 Unity 必學知識,它們在 Unity 中具有不可撼動的核心地位。
前提條件
當兩個遊戲物件(GameObject)都有碰撞體組件(Collider Component),並且其中一方擁有剛體(Rigidbody),通常是事件的發起人,依據 is Trigger 有沒有勾選,會有 Enter/Stay/Exit 共三種差異。
OnCollision | 物理碰撞體積
在 Unity 遊戲設計中,會需要讓物件有碰撞體積,並且確認玩家碰撞的情況與情形,有三種不同的情形,物件彼此碰撞的當下、物件保持碰撞的時候、物件離開碰撞後。
OnCollisionEnter
當物件彼此碰撞的當下,可以使用此函數進行事件,並且我們可以獲取被碰撞體的資訊,通常會放在遊戲物件,並偵測玩家後對玩家進行操作。
private void OnTriggerExit(Collider other)
{
if (other.tag == "Player")
{
BoxCollider coli = GetComponent<BoxCollider>();
coli.enabled = true;
}
}
OnCollisionStay
當物件保持碰撞的時候,可以使用此函數進行事件,並且我們可以獲取被碰撞體的資訊,將會每一幀觸發一次函式。
private void OnCollisionStay(Collider other)
{
Debug.Log("玩家扣1滴血);
//這行程式會狂跳。
}
OnCollisionExit
當物件離開碰撞的時候,可以使用此函數進行事件,並且我們可以獲取被碰撞體的資訊,將只會觸發一次。
private void OnCollisionExit(Collider other)
{
Debug.Log("玩家離開");
}
OnTrigger | 偵測觸發事件
在使用上跟碰撞體(Collision)相同,需要勾選 is Trigger ,在這種情況下碰撞體內的全部範圍都會變成偵測範圍,玩家可以自由穿越其中,有物件進入偵測範圍、物件滯留在偵測範圍、物件離開偵測範圍三種不同模式。
OnTriggerEnter
當玩家進入偵測範圍時,可以用在類似感應門的觸發事件,每次觸發一次事件,離開再進入可以重複觸發,配合上程式撰寫能做出拌線、地雷等一次性事件機關。
private void OnTriggerEnter(Collider other)
{
Debug.Log("開門");
}
OnTriggerStay
當玩家留在偵測範圍時,可以每幀觸發一次函數,很適合用在持續扣血的酸液池或消耗耐久度的毒霧等事件。
private void OnTriggerStay(Collider other)
{
if(other.tag =="Player")
{
Rigidbody rigi = other.GetComponent<Rigidbody>();
Debug.Log("玩浸泡在死亡池中");
rigi.drag = sticky;
player = other.gameObject;
InPool = true;
}
}