由於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 }