One way to avoid repeat adding the event listener when calling 'AddListener()' again is to remove the existing event listeners before adding new ones. Here's an updated version of the code that removes the previous event listeners before adding new ones:

private void AddListener()
{
    // Get all the buttons in the scene
    buttons = FindObjectsOfType<UIButton>(true);

    // Remove existing event listeners for each button
    foreach (var button in buttons)
    {
        var eventTrigger = button.GetComponent<EventTrigger>();
        if (eventTrigger != null)
        {
            var pointerEnter = eventTrigger.triggers.Find(entry => entry.eventID == EventTriggerType.PointerEnter);
            if (pointerEnter != null)
            {
                eventTrigger.triggers.Remove(pointerEnter);
            }
        }
    }

    // Add event listeners for each button
    foreach (var button in buttons)
    {
        button.gameObject.AddComponent<EventTrigger>();
        var eventTrigger = button.GetComponent<EventTrigger>();

        // Add pointer enter event listener
        var pointerEnter = new EventTrigger.Entry();
        pointerEnter.eventID = EventTriggerType.PointerEnter;
        pointerEnter.callback.AddListener((data) => { OnButtonPointerEnter(button); });
        eventTrigger.triggers.Add(pointerEnter);
    }
}

This updated code first removes the existing 'PointerEnter' event listener from each button's 'EventTrigger' component, if it exists. Then, it adds the new 'PointerEnter' event listener to each button.

How to Prevent Duplicate Event Listeners in Unity: A C# Solution

原文地址: https://www.cveoy.top/t/topic/pChv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录