Trigger
當滿足下面三項條件,且兩物件相碰時,兩物件就會同時觸發自身的 OnTrigger 系列事件。
- 雙方都必需有 Collider 碰撞框元件
- 其中一方必須有 Rigidbody、或者 CharacterController
- 且其中一方的 Collider 元件有勾選 Is Trigger (通常是金幣、開關)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour
{
void Start()
{
}
void Update()
{
}
private void OnTriggerEnter(Collider other)
{
// 這邊在"兩物件產生交疊"時會執行一次
if (other.gameObject.tag == "Player")
{
// 如果碰到的物件是 Player 的話...
}
}
private void OnTriggerStay(Collider other)
{
// 這邊在"兩物件交疊"時會持續執行
}
private void OnTriggerExit(Collider other)
{
// 這邊在"兩物件離開交疊"時會執行一次
}
}
回傳參數 other 的作用
OnTrigger 系列的事件會傳入碰撞對象的 collider 名為 other,這個參數非常有用,可以需要透過它來取得碰撞對象的各種資訊。
private void OnTriggerEnter(Collider other)
{
other.gameObject // 對方的 gameObject
other.tag // 對方的tag(等於 other.gameObject.tag)
other.name // 對方的名稱(等於 other.gameObject.name)
other.transform // 對方的座標(等於 other.gameObject.transform)
other.attachedRigidbody // 對方的 Rigidbody
}
範例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour
{
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, 0, v);
Vector3 move = dir.normalized * 100 * Time.deltaTime;
rb.AddForce(move);
}
private void OnTriggerEnter(Collider other)
{
// 當物件開始交疊時,執行一次
// 將自身顏色改為紅色
// (由於接著會執行 OnTriggerStay
// 到了算圖時,球體已經設為綠色,所以並不會看見紅色)
if (other.gameObject.tag == "Box")
{
GetComponent<MeshRenderer>().material.color = Color.red;
}
}
private void OnTriggerStay(Collider other)
{
// 當兩物件交疊時,持續執行
// 將自身顏色改為綠色
if (other.gameObject.tag == "Box")
{
GetComponent<MeshRenderer>().material.color = Color.green;
}
}
private void OnTriggerExit(Collider other)
{
// 當兩物件不再交疊時,執行一次
// 將自身顏色改為灰色
if (other.gameObject.tag == "Box")
{
GetComponent<MeshRenderer>().material.color = Color.gray;
}
}
}
TIP
大多數金幣、開關都是單獨使用 OnTriggerEnter 居多。
少數情況下才會使用另外兩個,例如:人物站在火堆中會持續扣血,就適合使用 OnTriggerStay