天天看點

Event Manager and Event Listener



我已經讀完關于事件的檔案,看着一對夫婦的教程,但是還有一些我仍然不握。在我見過的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);
     }
 }
           

繼續閱讀