進階版可以看雨松大大的這篇
最近在弄Rigidbody(剛體)和Collider時發現一個問題,一旦他們出現觸發(或碰撞)事件後,只會呼叫自己身上的script而已。
像是下面這張圖
若Rigidbody和Collider只放在兩個Cube上,但是觸發(或碰撞)事件的程式碼又沒有放在這兩個Cube上,就會無法正確達成想要的功能。
建議先稍微看一下下面這三篇文章
對於這種情況,我使用委派(Delegate)和事件(Event)的方式來進行廣播,讓該場景(Scene)的物件能接收到,使用步驟如下:
- 宣告一個委派方法A。
- 利用這個委派方法A產生一個事件物件B。
- 宣告一個方法C,該方法的傳入傳出參數需和委派相同,該方法用來給其他人呼叫,而該方法則用來呼叫事件物件B。(該步驟非必要)
- 把和方法A有著相同傳入傳出參數的方法D使用+=指定給事件物件B。
- 當使用者呼叫C時,則會透過委派去呼叫D。
P.S.使用觸發(Trigger)來做示範
首先稍微設置一下場景,其中UpCube和DownCube是Empty GameObject
上面那個Cube就是UpCube的Cube1了
再來對上面那個Cube放上剛體(只要Cube1和Cube2其中一個Collider的Is Trigger有打勾即可)
新增2個 script,分別命名為EventBroadcast和Test
EventBroadcast將觸發事件發送出去
Test接收觸發事件
開始編寫程式碼!
using UnityEngine;
public class EventBroadcast : MonoBehaviour
{
public delegate void sendMessage(GameObject obj, string state, Collider collider);//宣告委派,該委派無返回值、有三個傳入的參數
public static event sendMessage sendEvent;//宣告事件,該事件必須為public static
private void Message(GameObject obj, string state, Collider collider)
{
sendEvent(obj, state, collider);
}
private void OnTriggerEnter(Collider collider)
{
//這個gameObject為該script所放置的物件
//假設該script放在CubeA,則gameObject代表的就是CubeA
Message(gameObject, "Enter", collider);
}
private void OnTriggerStay(Collider collider)
{
Message(gameObject, "Stay", collider);
}
private void OnTriggerExit(Collider collider)
{
Message(gameObject, "Exit", collider);
}
}
using UnityEngine;
public class Test : MonoBehaviour
{
private void Start()
{
EventBroadcast.sendEvent += EnterEvent;
EventBroadcast.sendEvent += StayEvent;
EventBroadcast.sendEvent += ExitEvent;
}
private void EnterEvent(GameObject obj, string state, Collider collider)
{
//若不是Enter則立刻結束Method
if (state.Equals("Enter") == false)
return;
Debug.Log("obj:" + obj.name + ", 撞到了:" + collider.name);
}
private void StayEvent(GameObject obj, string state, Collider collider)
{
//若不是Stay則立刻結束Method
if (state.Equals("Stay") == false)
return;
Debug.Log("obj:" + obj.name + ", 停留在:" + collider.name);
}
private void ExitEvent(GameObject obj, string state, Collider collider)
{
//若不是Exit則立刻結束Method
if (state.Equals("Exit") == false)
return;
Debug.Log("obj:" + obj.name + ", 離開了:" + collider.name);
}
}
之後將EventBroadcast放到想要發出觸發事件的剛體物件上!
Test隨意找個物件放即可(我放到UpCube上)
按下執行!
留言列表