Unity UGUI Button扩展

由于UGUI中的Button组件只能添加Click一种事件有一定的局限性,如果我要做当按钮被按下时并且手指不离开屏幕让按钮缩小如果只用Click事件当手指滑动到其他地方后就没办法恢复到按钮原来的大小了。还比如我没还要检测手指在按钮上滑动的距离这时Button组件明显也不满足需求。所以我就根据UGUI中Button组件的源码写了拥有按下、抬起、离开按钮、开始滑动、停止滑动、滑动等事件的组件代码如下:

  1 using System;
  2 
  3 using UnityEngine;
  4 using UnityEngine.Events;
  5 using UnityEngine.EventSystems;
  6 using UnityEngine.Serialization;
  7 using UnityEngine.UI;
  8 
  9 [AddComponentMenu("UGUIExpend/UITouch", 30)]
 10 public class UITouch : Selectable, IBeginDragHandler, IDragHandler, IEndDragHandler
 11 {
 12     [Serializable]
 13     public class TouchEvent : UnityEvent
 14     {
 15         public PointerEventData  eventData = default;
 16     }
 17 
 18     [SerializeField]
 19     private TouchEvent m_OnTouchDown = new TouchEvent();
 20 
 21     [SerializeField]
 22     private TouchEvent m_OnTouchUp = new TouchEvent();
 23 
 24     [SerializeField]
 25     private TouchEvent m_OnTouchExit = new TouchEvent();
 26 
 27     [SerializeField]
 28     private TouchEvent m_OnBeginSlide = new TouchEvent();
 29 
 30     [SerializeField]
 31     private TouchEvent m_OnSlide = new TouchEvent();
 32 
 33     [SerializeField]
 34     private TouchEvent m_OnEndSlide = new TouchEvent();
 35 
 36     protected UITouch(){}
 37     public TouchEvent OnTouchDown
 38     {
 39         get { return this.m_OnTouchDown; }
 40         set { m_OnTouchDown = value; }
 41     }
 42 
 43     public TouchEvent OnTouchUp
 44     {
 45         get { return this.m_OnTouchUp; }
 46         set { this.m_OnTouchUp = value; }
 47     }
 48 
 49     public TouchEvent OnTouchExit
 50     {
 51         get { return m_OnTouchExit; }
 52         set { m_OnTouchExit = value; }
 53     }
 54 
 55     public TouchEvent OnBeginSlider
 56     {
 57         get { return m_OnBeginSlide; }
 58         set { m_OnBeginSlide = value; }
 59     }
 60 
 61     public TouchEvent OnSlider
 62     {
 63         get { return m_OnSlide; }
 64         set { m_OnSlide = value; }
 65     }
 66     public TouchEvent OnEndSlider
 67     {
 68         get { return m_OnEndSlide; }
 69         set { m_OnEndSlide = value; }
 70     }
 71 
 72     private void touchDownOption(PointerEventData eventData)
 73     {
 74         if(!IsActive() || !IsInteractable())
 75         {
 76             return;
 77         }
 78         UISystemProfilerApi.AddMarker("UITouch.OnTouchDown",this);
 79         m_OnTouchDown.eventData = eventData;
 80         m_OnTouchDown.Invoke();
 81     }
 82 
 83     private void touchExitOption(PointerEventData eventData)
 84     {
 85         if (!IsActive() || !IsInteractable())
 86         {
 87             return;
 88         }
 89         UISystemProfilerApi.AddMarker("UITouch.OnTouchExit", this);
 90         m_OnTouchExit.eventData = eventData;
 91         m_OnTouchExit.Invoke();
 92     }
 93 
 94     private void touchUpOption(PointerEventData eventData)
 95     {
 96         if (!IsActive() || !IsInteractable())
 97         {
 98             return;
 99         }
100         UISystemProfilerApi.AddMarker("UITouch.OnTouchUp", this);
101         m_OnTouchUp.eventData = eventData;
102         m_OnTouchUp.Invoke();
103     }
104 
105     private void slideOption(PointerEventData eventData)
106     {
107         if (!IsActive() || !IsInteractable())
108         {
109             return;
110         }
111         UISystemProfilerApi.AddMarker("UITouch.OnSlider", this);
112         m_OnSlide.eventData = eventData;
113         m_OnSlide.Invoke();
114     }
115     private void beginSlideOption(PointerEventData eventData)
116     {
117         if (!IsActive() || !IsInteractable())
118         {
119             return;
120         }
121         UISystemProfilerApi.AddMarker("UITouch.OnSlider", this);
122         m_OnBeginSlide.eventData = eventData;
123         m_OnBeginSlide.Invoke();
124     }
125     private void endSlideOption(PointerEventData eventData)
126     {
127         if (!IsActive() || !IsInteractable())
128         {
129             return;
130         }
131         UISystemProfilerApi.AddMarker("UITouch.OnSlider", this);
132         m_OnEndSlide.eventData = eventData;
133         m_OnEndSlide.Invoke();
134     }
135     public override void OnPointerDown(PointerEventData eventData)
136     {
137         if (eventData.button != PointerEventData.InputButton.Left)
138         {
139             return;
140         }
141         touchDownOption(eventData);
142     }
143     public override void OnPointerUp(PointerEventData eventData)
144     {
145         if(eventData.button != PointerEventData.InputButton.Left)
146         {
147             return;
148         }
149         touchUpOption(eventData);
150     }
151     public override void OnPointerExit(PointerEventData eventData)
152     {
153         if (eventData.button != PointerEventData.InputButton.Left)
154         {
155             return;
156         }
157         touchExitOption(eventData);
158     }
159 
160     public void OnBeginDrag(PointerEventData eventData)
161     {
162         if (eventData.button != PointerEventData.InputButton.Left)
163         {
164             return;
165         }
166         beginSlideOption(eventData);
167         //throw new NotImplementedException();
168     }
169 
170     public void OnDrag(PointerEventData eventData)
171     {
172         if (eventData.button != PointerEventData.InputButton.Left)
173         {
174             return;
175         }
176         slideOption(eventData);
177     }
178 
179     public void OnEndDrag(PointerEventData eventData)
180     {
181         if (eventData.button != PointerEventData.InputButton.Left)
182         {
183             return;
184         }
185         endSlideOption(eventData);
186     }
187 }

 

原文地址:https://www.cnblogs.com/sy-liu/p/12860034.html