2016-12-23 13 views
1

Я создаю скрипт для длинного нажатия кнопки. Длительное нажатие кнопки работает. Единственная проблема заключается в том, что если длинная кнопка нажимает триггеры, я хочу предотвратить нажатие на кнопку.Unity Prevent Нажмите кнопку On

using UnityEngine; 
using UnityEngine.Events; 
using UnityEngine.EventSystems; 
using System.Collections; 

public class LongPressButton : UIBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler 
{ 
    [Tooltip("How long must pointer be down on this object to trigger a long press")] 
    public float durationThreshold = 1.0f; 

    public UnityEvent onLongPress = new UnityEvent(); 

    private bool isPointerDown = false; 
    private bool longPressTriggered = false; 
    private float timePressStarted; 

    private void Update() 
    { 
     if (isPointerDown && !longPressTriggered) 
     { 
      if (Time.time - timePressStarted > durationThreshold) 
      { 
       longPressTriggered = true; 
       onLongPress.Invoke(); 
      } 
     } 
    } 

    public void OnPointerDown(PointerEventData eventData) 
    { 
     timePressStarted = Time.time; 
     isPointerDown = true; 
     longPressTriggered = false; 
    } 

    public void OnPointerUp(PointerEventData eventData) 
    { 
     isPointerDown = false; 
    } 


    public void OnPointerExit(PointerEventData eventData) 
    { 
     isPointerDown = false; 
    } 
} 

Сценарий кнопки черного цвета, кажется, что он встроен в единый движок.

Я знаю, что есть способы предотвратить распространение событий в 3D-мире, но есть ли способ предотвратить распространение на кнопочном скрипте?

ответ

0

Я понял, из-за ограничений Unity в системе событий вам понадобятся два сценария. Сначала долго нажмите кнопку Сценария:

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

public class LongPressButton : UIBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler 
{ 
    [Tooltip("How long must pointer be down on this object to trigger a long press")] 
    public float durationThreshold = 1.0f; 

    public UnityEvent onLongPress = new UnityEvent(); 

    private bool isPointerDown = false; 
    private bool longPressTriggered = false; 
    private float timePressStarted; 

    public bool WasLongPressTriggered 
    { 
     get; 
     protected set; 
    } 

    private void Update() 
    { 
     if (isPointerDown && false == longPressTriggered) 
     { 
      if (Time.time - timePressStarted > durationThreshold) 
      { 
       longPressTriggered = true; 
       WasLongPressTriggered = true; 
       onLongPress.Invoke(); 
      } 
     } 
    } 

    public void OnPointerDown(PointerEventData eventData) 
    { 
     timePressStarted = Time.time; 
     isPointerDown = true; 
     longPressTriggered = false; 
     WasLongPressTriggered = false; 
    } 

    public void OnPointerUp(PointerEventData eventData) 
    { 
     isPointerDown = false; 
    } 


    public void OnPointerExit(PointerEventData eventData) 
    { 
     isPointerDown = false; 
    } 
} 

Тогда вам нужен новая кнопку сценарий, чтобы переопределить старую основную кнопку:

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

public class Button2 : Button 
{ 
    public bool PreventPropagationOnLongPress; 

    public override void OnPointerClick(PointerEventData eventData) 
    { 
     var longPress = GetComponent<LongPressButton>(); 
     if (longPress == null) 
     { 
      base.OnPointerClick(eventData); 
     } 
     if(false == longPress.WasLongPressTriggered) 
     { 
      base.OnPointerClick(eventData); 
     } 
    } 
} 

Это работает в редакторе он еще не полностью протестирован на мобильном , потенциально в единстве edidor, который вызывается нажатием на точку, но на мобильном устройстве он может запускаться с помощью мыши вверх ... пока это предотвратит распространение события,