進階版可以看雨松大大的這篇

 

 

最近在弄Rigidbody(剛體)和Collider時發現一個問題,一旦他們出現觸發(或碰撞)事件後,只會呼叫自己身上的script而已。

 

像是下面這張圖

若Rigidbody和Collider只放在兩個Cube上,但是觸發(或碰撞)事件的程式碼又沒有放在這兩個Cube上,就會無法正確達成想要的功能。

建議先稍微看一下下面這三篇文章

文章1

文章2

文章3

觸發事件介紹

對於這種情況,我使用委派(Delegate)和事件(Event)的方式來進行廣播,讓該場景(Scene)的物件能接收到,使用步驟如下:

  1. 宣告一個委派方法A。
  2. 利用這個委派方法A產生一個事件物件B。
  3. 宣告一個方法C,該方法的傳入傳出參數需和委派相同,該方法用來給其他人呼叫,而該方法則用來呼叫事件物件B。(該步驟非必要)
  4. 把和方法A有著相同傳入傳出參數的方法D使用+=指定給事件物件B。
  5. 當使用者呼叫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上)

 

 

按下執行!

arrow
arrow
    全站熱搜

    Yang 發表在 痞客邦 留言(0) 人氣()