2017-10-09 245 views
3

我目前正在審查代碼。爲什麼要從Unity委託事件中刪除事件?

在審查過程中,我收到了一些問題。

這是接收事件的部分的代碼內容。

EventManager.cs:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using System; 

namespace wp.events 
{ 
    delegate void WordEventDelegate(object obj, EventArgs e); // 델리게이트 선언 
    class EventManager : WordGameSingleton<EventManager> // 싱글톤 상속받음 
    { 
     public event WordEventDelegate wordeSendEvent; // 이벤트 델리게이트 선언 

     public void dispatchEvent(object obj, EventTypes type, Hashtable data = null) // 이벤트 수신 
     { 
      GameEvent evt = new GameEvent(); 
      evt.obj = obj; // 받은 이벤트의 객체 
      evt.eventType = type; // 받은 이벤트의 타입 
      evt.evetData = data; // 받은 이벤트의 데이터 

      wordeSendEvent (this, evt); 
     } 

     public void addEvent(WordEventDelegate wedlistener) // 이벤트를 추가함 
     { 
      wordeSendEvent += wedlistener; 
     } 

     public void removeEvent(WordEventDelegate wedlistener) // 이벤트를 삭제함 
     { 
      wordeSendEvent -= wedlistener; 
     } 
    } 
} 

我設置的事件類型的代碼來枚舉。

例如..

public enum EventTypes 
{ 
    GAME_INIT, 
    ... 
} 

登記事件被實現爲接口,以及對象和EventArgs的被設置爲參數。

例如..

interface IWordGame 
{ 
    void onHandleEvent(object sender, EventArgs e); 
} 

而當遊戲開始時,會將init()函數中的事件。

例如..

public void init() 
{ 
    EventManager.Instance.addEvent(onHandleEvent); 
} 

我明白,即使添加事件。 但是,我不知道爲什麼再次刪除了添加的事件。

該部分顯示在下面的代碼中。

public void onHandleEvent(object sender, EventArgs e) 
{ 
    GameEvent evt = e as GameEvent; 
    Debug.Log(">> event type : " + evt.type); 
    switch(evt.type) 
    { 
     case EventTypes.INTRO_STAR: 
      EventManager.Instance.removeEvent(onHandleEvent); 
      break; 
    } 
} 

我很好奇。我不明白爲什麼我想刪除添加的事件。

你能否澄清這部分?

請幫助我作爲初學者。

+1

我希望你的代碼審查也提出了這個代碼使用Java命名約定而不是C#的命令。 – Enigmativity

+1

此外,名爲'On *'的方法按慣例用於引發事件而不是處理它。你的'onHandleEvent'顯然處理事件。它應該被恰當地稱爲'HandleEvent'。 – Enigmativity

回答

3

此模式僅用於一次收聽任何特定事件。例如在你的案例初始化遊戲。如果您不會從事件中取消訂閱處理程序,則只要事件被觸發,它就會繼續接收呼叫。

這裏是你的代碼做什麼:

  1. 訂閱事件。
  2. 處理第一個事件。
  3. 取消訂閱第一次電話會議後發送的目的。

這將認購/註冊EventManagers的wordeSendEvent

public void init() 
{ 
    EventManager.Instance.addEvent(onHandleEvent); // subscribing 
} 

onHandleEvent是監聽器wordeSendEvent。當這個事件第一次被觸發時,將會調用onHandleEvent

,它會退訂eventmanager進行的wordeSendEvent

case EventTypes.INTRO_STAR: 
    EventManager.Instance.removeEvent(onHandleEvent); // unsubscribing 
break; 

希望這有助於。

+0

事件的開始是否意味着我已經註冊了一個事件? –

+0

@최성원查看我的更新回答 –

+1

好我明白 –