//-------------------------------------------------------- 
 | 
//    [Author]:           玩个游戏 
 | 
//    [  Date ]:           Saturday, November 25, 2017 
 | 
//-------------------------------------------------------- 
 | 
using UnityEngine; 
 | 
using UnityEngine.Events; 
 | 
using UnityEngine.EventSystems; 
 | 
using System.Collections.Generic; 
 | 
using System; 
 | 
  
 | 
  
 | 
    [RequireComponent(typeof(RectTransform))] 
 | 
    public class FakeButton : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IDragHandler 
 | 
    { 
 | 
        RectTransform m_RectTransform; 
 | 
        public RectTransform rectTransform { get { return m_RectTransform ?? (m_RectTransform = this.transform as RectTransform); } } 
 | 
  
 | 
        Action m_OnClick; 
 | 
  
 | 
        public void AddListener(Action action) 
 | 
        { 
 | 
            m_OnClick += action; 
 | 
        } 
 | 
  
 | 
        public void RemoveAllListeners() 
 | 
        { 
 | 
            m_OnClick = null; 
 | 
        } 
 | 
  
 | 
        public void OnPointerUp(PointerEventData eventData) 
 | 
        { 
 | 
            PassEvent(eventData, ExecuteEvents.pointerUpHandler); 
 | 
        } 
 | 
  
 | 
        public void OnPointerDown(PointerEventData eventData) 
 | 
        { 
 | 
            PassEvent(eventData, ExecuteEvents.pointerDownHandler); 
 | 
        } 
 | 
  
 | 
        public void OnDrag(PointerEventData eventData) 
 | 
        { 
 | 
            PassEvent(eventData, ExecuteEvents.dragHandler); 
 | 
        } 
 | 
  
 | 
        public void OnPointerClick(PointerEventData eventData) 
 | 
        { 
 | 
            m_OnClick?.Invoke(); 
 | 
            PassEvent(eventData, ExecuteEvents.submitHandler); 
 | 
            PassEvent(eventData, ExecuteEvents.pointerClickHandler); 
 | 
        } 
 | 
  
 | 
        public void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler 
 | 
        { 
 | 
            List<RaycastResult> results = new List<RaycastResult>(); 
 | 
            EventSystem.current.RaycastAll(data, results); 
 | 
            GameObject current = data.pointerCurrentRaycast.gameObject; 
 | 
            for (int i = 0; i < results.Count; i++) 
 | 
            { 
 | 
                if (current != results[i].gameObject) 
 | 
                { 
 | 
                    if (ExecuteEvents.Execute(results[i].gameObject, data, function)) 
 | 
                    { 
 | 
                        break; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
  
 | 
    } 
 |