Event Manager and Event Listener
阿新 • • 發佈:2019-01-25
所以我的設定如下所示 (所有這些都連線到獨立遊戲物件):
我已經讀完關於事件的檔案,看著一對夫婦的教程,但是還有一些我仍然不握。在我見過的Event Managers事件管理器示例,將觸發該事件的方法是在同一個class 作為事件管理器。喜歡這個:
using UnityEngine; using System.Collections; public class EventManager : MonoBehaviour { public delegate void CheckpointHandler(int id); public static event CheckpointHandler checkpointReached; void OnGUI () { if( GUI.Button(new Rect(5,5,150,40),"Checkpoint")){ checkpointReached(555); } } }
所以在這裡,EventManager 不僅定義委託和事件,而且還建立一個按鈕,將觸發該事件。
這是什麼讓我困惑。以為 EventManager 將什麼也不做只是是定義的事件。然後你會解僱那些來自其他指令碼的事件。有沒有辦法做到這一點嗎?
我不喜歡此示例設定,因為它似乎必須將"EventManager"指令碼附加到每個可能可以觸發事件的物件的方式。如果有多個物件,可以引發同一事件嗎?我需要將相同的"EventManager"附加到每一個人嗎?
我想我可能會回答我自己的問題,但也許有人可以告訴我,是否這將執行成功與否。
我成立了 EvenManager 中的事件觸發器,作為公共方法,然後使用拖放的方法將 EventManager 置於其他類,使其方法可為任何想要觸發的事件。
using UnityEngine;
using System.Collections;
public class EventManager : MonoBehaviour {
//Here I define the delegates, events and the triggers that can be called to fire the event.
public delegate void CheckpointHandler(int id);
public static event CheckpointHandler checkpointReached;
public void hitCheckpoint (int id){
if (checkpointReached != null)
checkpointReached(id);
}
}
using UnityEngine;
using System.Collections;
public class EventTrigger : MonoBehaviour {
/******
In this class I can set up a method that will access the EventManager
(which has been dropped onto the em variable)
and fire the hitCheckpoint method,
which in turn sends the checkpointReached event.
******/
public EventManager em;
void OnGUI () {
if( GUI.Button(new Rect(5,5,150,40),"Checkpoint ")){
em.hitCheckpoint(555);
}
}
}
using UnityEngine;
using System.Collections;
public class EventListener : MonoBehaviour {
//This script listens for the event and prints a message to the log.
void OnEnable () {
EventManager.checkpointReached += HandleEventManagercheckpointReached;
}
void OnDisable(){
EventManager.checkpointReached -= HandleEventManagercheckpointReached;
}
void HandleEventManagercheckpointReached (int id)
{
Debug.Log ("Checkpoint reahed. ID is: " + id);
}
}