2017-10-09 6 views
3

現在、コードを確認しています。ユニティデリゲートイベントからイベントを削除するのはなぜですか?

レビュー中、私は質問がありました。

これは、イベントを受信したパートのコード内容です。

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

あなたのコードレビューが、このコードがC#の名前付け規則ではなくJava命名規則を使用していることを歓迎したいと思います。 – Enigmativity

+1

また、 'On *'という名前のメソッドは、慣習的に、イベントを処理するのではなく、イベントを発生させるために使用されます。あなたの 'onHandleEvent'は明らかにイベントを処理しています。これは、適切に 'HandleEvent'と呼ばれるべきです。 – Enigmativity

答えて

3

このパターンは、特定のイベントを1回だけ聴くために使用されます。例えばあなたの場合ゲームの初期化。イベントからハンドラの登録を解除しない場合、イベントが発生するたびにコールを受信し続けるでしょう。

  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

私は理解しています –

関連する問題