UNITY : 无法取消订阅事件处理程序

时间:2020-12-19 15:32:04

标签: unity3d events unsubscribe

有人可以帮我解决这个问题吗? 这是我的代码:

private void Update()
{
    if (General.UpdateActive == true)
    {
        if (General.charActive == 0)
        {
            for (int i = 0; i < CharacterItem.equipmentSlots; i++)
            {
                CharacterItem.MC_EquipmentSlots[i].OnDropEvent += slot => OnDropEvent(slot);


                CharacterItem.Merc1_EquipmentSlots[i].OnDropEvent -= slot => OnDropEvent(slot);

                CharacterItem.Merc2_EquipmentSlots[i].OnDropEvent -= slot => OnDropEvent(slot);

                CharacterItem.Merc3_EquipmentSlots[i].OnDropEvent -= slot => OnDropEvent(slot);
            }
        }
        else if (General.charActive == 1)
        {
            for (int i = 0; i < CharacterItem.equipmentSlots; i++)
            {

            }
        }

对于 Mer1,同上,但将 MC 部分更改为 -=,将 Merc1 部分更改为 += 问题是当我选择其他字符时,事件处理程序不会取消订阅。 当我选择MC时,它在MC_EquipmentSlots中添加事件,然后当我选择Merc1时,MC_EquipmentSlots仍然有它的事件。

令人困惑的部分是,当我循环浏览字符时,口袋中的代码按预期工作。我尝试将口袋代码复制到设备代码中,但仍然出现我之前提到的错误。

CharacterItem.MC_PocketSlots[i].OnDropEvent += slot => EventHelper(slot, OnDropEvent);
CharacterItem.Merc1_PocketSlots[i].OnDropEvent -= slot => EventHelper(slot, OnDropEvent);
CharacterItem.Merc2_PocketSlots[i].OnDropEvent -= slot => EventHelper(slot, OnDropEvent);
CharacterItem.Merc3_PocketSlots[i].OnDropEvent -= slot => EventHelper(slot, OnDropEvent);

请提前帮助并感谢您。

1 个答案:

答案 0 :(得分:0)

当您使用 lambda 表达式作为事件侦听器时会发生这种情况!它们不可订阅 ;)

而是添加和删除侦听器,例如

 CharacterItem.MC_EquipmentSlots[i].OnDropEvent += OnDropEvent;
 CharacterItem.Merc1_EquipmentSlots[i].OnDropEvent -= OnDropEvent;
 CharacterItem.Merc2_EquipmentSlots[i].OnDropEvent -= OnDropEvent;
 CharacterItem.Merc3_EquipmentSlots[i].OnDropEvent -= OnDropEvent;
相关问题