После вызова клика после сброса timer
, но вы не сбросили gazedAt
=> метод Update
все еще запускает таймер и снова вызывает клик.
Кажется, что ваш PointerExit
вообще не вызывается, и поэтому кнопка никогда не сбрасывается.
Вместо EventTrigger
я настоятельно рекомендую использовать интерфейсы IPointerEnterHandler
и IPointerExitHandler
как
public class YourClass : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
//...
public void OnPointerEnter()
{
}
public void OnPointerExit()
{
}
Я бы вообще не использовал Update
, но предпочел бы Coroutine .Также не используйте сложный вызов ExecuteEvents.Execute(gameObject, new PointerEventData(EventSystem.current), ExecuteEvents.pointerDownHandler);
, вместо этого используйте Getcomponent<Button>().onClick.Invoke();
или вызовите метод напрямую
private Button _button;
private void Awake()
{
// Get the reference only once to avoid
// having to get it over and over again
_button = GetComponent<Button>();
}
private IEnumerator Gaze()
{
// wait for given time
yield return new WaitForSeconds(gazeTime);
// call the buttons onClick event
_button.onClick.Invoke();
// or as said alternatively directly use the methods e.g.
setting.ActivateSetting();
}
public void OnPointerEnter()
{
Debug.Log("PointerEnter");
// start the coroutine
StartCoroutine(Gaze());
}
public void OnPointerExit()
{
Debug.Log("PointerExit");
// stop/interrupt the coroutine
StopCoroutine(Gaze());
}
Как вы можете видеть, в timer
и * 1030 нет необходимости вообще* значения, так что вы не можете забыть сбросить их где-нибудь.Это также позволяет избежать повторного вызова метода.
Если вы вообще не хотите использовать Button
, вы также можете добавить свой UnityEvent
как
// add callbacks e.g. in the Inspector or via script
public UnityEvent onGazedClick;
// ...
onGazedClick.Invoke();