统一删除监听器

时间:2017-10-22 08:09:14

标签: c# unity3d

我在下面的代码中为游戏对象添加了一个监听器:

 Game_Controller.Database [m, n].Nute_M.AddComponent(typeof(EventTrigger));
 EventTrigger trigger =Game_Controller.Database [m, n].Nute_M.GetComponent<EventTrigger> ();
 EventTrigger.Entry entry = new EventTrigger.Entry ();
 entry.eventID =EventTriggerType.PointerClick;
 entry.callback.AddListener ((eventData) => Game_Controller.Database [m, n].Nute_M.GetComponent<Nute_Onclick> ().onclick (m, n, "white"));
 trigger.triggers.Add (entry);

我在从游戏对象中删除此侦听器时遇到问题....

它不起作用:

EventTrigger trigger =Game_Controller.Database [indexi, indexj].Nute_M.GetComponent<EventTrigger> ();
EventTrigger.Entry entry = new EventTrigger.Entry ();
entry.eventID = EventTriggerType.PointerClick;
entry.callback.RemoveAllListeners ();
trigger.triggers.Add (entry);

请帮帮我。

1 个答案:

答案 0 :(得分:1)

您需要删除添加的同一对象的侦听器。在第trigger.triggers.Add (entry);行中,您可以将EventTrigger.Entry的实例添加到列表中。当您使用EventTrigger.Entry entry = new EventTrigger.Entry ();时,您在triggers列表中创建了没有任何侦听器的EventTrigger.Entry的新内容。因此,您必须在列表中找到您创建的收件人条目,并从中删除监听器 例如:

EventTrigger trigger =Game_Controller.Database [indexi, indexj].Nute_M.GetComponent<EventTrigger> ();
List<EventTrigger.Entry> entriesToRemove = new List<EventTrigger.Entry>();

//finding required entry by eventId
foreach (var entry in trigger.triggers)
{        
    if (entry.eventID == EventTriggerType.PointerClick)
    {
        //remove listener from entry
        entry.callback.RemoveAllListeners();
        //add entry to transitional list
        entriesToRemove.Add(entry);
    }
}

//remove all entries satisfied condition from triggerlist
foreach(var entry in entriesToRemove)
{
    trigger.triggers.Remove(entry);
}