为什么要从Unity委托活动中删除活动?

时间:2017-10-09 11:00:01

标签: c# unity3d interface

我目前正在审核该代码。

在审核期间,我收到了一些问题。

这是接收活动的部分的代码内容。

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;
        }
    }
}

我将EventTypes设置为代码中的枚举。

例如..

public enum EventTypes
{
    GAME_INIT,
    ...
}

注册事件作为接口实现,object和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 个答案:

答案 0 :(得分:3)

此模式仅用于侦听任何特定事件一次。例如在您的情况下初始化游戏。如果您不会从事件中取消订阅处理程序,则会在触发事件时继续接收调用。

以下是您的代码所做的事情:

  1. 订阅活动。
  2. 处理第一个事件。
  3. 首次通话后取消订阅活动,因为目的已经送达。
  4. 这将订阅/注册到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;
    

    希望这有帮助。