【问题标题】:UNITY : cannot unsubscribe event handlerUNITY : 无法取消订阅事件处理程序
【发布时间】:2021-03-29 22:59:27
【问题描述】:

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

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

请帮助并提前感谢您。

【问题讨论】:

  • 当你写slot =&gt; OnDropEvent(slot)时,你动态地创建了一个函数。下次你写slot =&gt; OnDropEvent(slot) 时,你动态地创建另一个函数(这与第一个函数不同)。因此,您正在尝试从未添加到此事件的事件中删除处理函数。

标签: unity3d events unsubscribe


【解决方案1】:

当您使用 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;

【讨论】:

  • 感谢您的建议。我尝试使用您说的代码,但现在它只将事件附加到 Merc3,即使我选择的角色是 MC 或其他角色。当我选择 MC 时,它应该从其他角色中删除事件并仅将事件添加到 MC。我使用 debug.log 并确定它只运行选定的字符代码。
猜你喜欢
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
相关资源
最近更新 更多