Моя функция PointerClick запускается дважды

#c# #unity3d

Вопрос:

У меня есть функция OnPointerClick (), которая иногда срабатывает дважды, если я продолжаю нажимать на несколько кнопок одновременно, хотя я нажимал эту кнопку только один раз. Это происходит в новой системе пользовательского интерфейса ввода. Как мне предотвратить это?

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ClickableButtons : MonoBehaviour, IPointerClickHandler {

public void OnPointerClick (PointerEventData eventData) {
        
       Debug.Log("Clicked"); //Called twice most of the time when button is pressed once
  }
}
 

Ответ №1:

Прежде всего, давайте попробуем решить проблему, вызванную 2 кликами, до того, как появятся причины 2 кликов. Потому что предоставленной вами информации недостаточно.

 public class ClickableButtons : MonoBehaviour, IPointerClickHandler
{
    private static readonly object ClickLock = new object();

    public void OnPointerClick(PointerEventData eventData)
    {
        lock (ClickLock)
        {
            Debug.Log("Clicked"); //Called twice most of the time when button is pressed once
        }
    }
}
 

Если вы укажете действия, которые должны быть выполнены после щелчка в инструкции «блокировка», это предотвратит одновременное выполнение действий.

 public class ClickableButtons : MonoBehaviour, IPointerClickHandler
{
    private static readonly object ClickLock = new object();
    private bool clicked = false;

    public void OnPointerClick(PointerEventData eventData)
    {
        if (clicked) return;

        lock (ClickLock)
        {
            clicked = true;

            Debug.Log("Clicked"); //Called twice most of the time when button is pressed once
            clicked = true;
        }

        clicked = false;
    }
}
 

Вы можете попытаться контролировать его с помощью оператора «если».
Но мне интересно, почему вы не используете событие onclick кнопки?

https://docs.unity3d.com/530/Documentation/ScriptReference/UI.Button-onClick.html

Комментарии:

1. Это аккуратный обходной путь, но я бы предпочел сосредоточиться на том, почему метод вызывается дважды в первую очередь -> скорее всего, потому что обратный вызов был добавлен дважды по какой-то причине ..