Я очень новичок в мероприятиях / делегатах, поэтому извините, если я использую неправильную терминологию.
Я использую скрипт инвентаризации для Unity, который использует события / делегаты C # для подписки на событие щелчка правой кнопкой мыши на слоте предмета.
Проблема в том, что когда я динамически добавляю новые слоты элементов, мне нужно добавить обработчики событий в новые слоты. Если бы я просто запустил UpdateEvents (), те, которые были там в первую очередь, теперь имеют дублирующие триггеры.
В текущем коде используется лямбда-синтаксис, и я изучил эти темы о том, как создать экземпляр делегата:
Вот оригинальная лямбда-подписка:
// This is the lambda expression that I want to unsubscribe to
ItemSlots[i].OnRightClickEvent += slot => EventHelper(slot, OnRightClickEvent);
Вот что я попробовал, и я пометил ** на частях, которые моя IDE выделяет как неправильные:
// Try 1
EventHandler lambda = slot => EventHelper(slot, OnRightClickEvent);
ItemSlots[i].OnRightClickEvent += lambda;
// Try 2
EventHandler handler = (sender, e) => EventHelper(sender, OnRightClickEvent);
ItemSlots[i].OnRightClickEvent += handler;
// Try 3
var myDelegate = delegate(sender, e) { EventHelper(**e**, OnRightClickEvent); };
ItemSlots[i].OnRightClickEvent += myDelegate;
Я также пытался преобразовать его без использования лямбды, но он не работает, как должно Я не уверен, что означает «слот» в лямбде. Это экземпляр, инициирующий событие? Вот что не сработало, но не выдало ошибок:
// Try without lambda
ItemSlots[i].OnRightClickEvent += OnRightClickEvent;
Вот сокращенная версия полного кода. Я не до конца понимаю, как работает метод EventHelper (), но кажется, что это какой-то ярлык для проверки на ноль.
using System;
using System.Collections.Generic;
using UnityEngine;
public abstract class ItemContainer : MonoBehaviour, IItemContainer {
public List<ItemSlot> ItemSlots;
// There are really 8 event here, but I simplified it
public event Action<BaseItemSlot> OnRightClickEvent;
protected virtual void Awake() {
UpdateEvents();
SetStartingItems();
}
public virtual void UpdateEvents() {
for (int i = 0; i < ItemSlots.Count; i++) {
// This is the lambda expression that I want to unsubscribe to
ItemSlots[i].OnRightClickEvent += slot => EventHelper(slot, OnRightClickEvent);
}
}
private void EventHelper(BaseItemSlot itemSlot, Action<BaseItemSlot> action) {
if (action != null)
action(itemSlot);
}
}