You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

261 line
8.6 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.CompilerServices;
  4. using UnityEngine;
  5. using UnityEngine.EventSystems;
  6. public class MultiTouchInputModule : StandaloneInputModule
  7. {
  8. public static void Execute(IBeginPinchHandler handler, BaseEventData pinchEvent)
  9. {
  10. handler.OnBeginPinch((PinchEventData)pinchEvent);
  11. }
  12. public static void Execute(IPinchHandler handler, BaseEventData pinchEvent)
  13. {
  14. handler.OnPinch((PinchEventData)pinchEvent);
  15. }
  16. public static void Execute(IEndPinchHandler handler, BaseEventData pinchEvent)
  17. {
  18. handler.OnEndPinch((PinchEventData)pinchEvent);
  19. }
  20. public static float PreviousProcessedInputTime { get; private set; }
  21. protected override void Awake()
  22. {
  23. base.Awake();
  24. this._pinchEventData = new PinchEventData(base.eventSystem);
  25. }
  26. protected override void Start()
  27. {
  28. base.Start();
  29. this._hasTouch = true;
  30. }
  31. public override void Process()
  32. {
  33. base.Process();
  34. if (this._hasTouch)
  35. {
  36. bool flag = UnityEngine.Input.touchCount > 0;
  37. if (flag)
  38. {
  39. this.ProcessTouchInput();
  40. this.ProcessTouchPinch();
  41. }
  42. }
  43. }
  44. private Vector2 FindPinchCenter(ICollection<PointerEventData> pointerEvents)
  45. {
  46. Vector2 vector = Vector2.zero;
  47. int num = 0;
  48. foreach (PointerEventData pointerEventData in pointerEvents)
  49. {
  50. vector += pointerEventData.position;
  51. if (++num == 2)
  52. {
  53. break;
  54. }
  55. }
  56. if (num > 0)
  57. {
  58. vector /= (float)num;
  59. }
  60. return vector;
  61. }
  62. private float FindPinchDistance(ICollection<PointerEventData> pointerEvents)
  63. {
  64. if (pointerEvents.Count >= 2)
  65. {
  66. IEnumerator<PointerEventData> enumerator = pointerEvents.GetEnumerator();
  67. enumerator.MoveNext();
  68. Vector2 position = enumerator.Current.position;
  69. enumerator.MoveNext();
  70. return Vector2.Distance(position, enumerator.Current.position);
  71. }
  72. return 0f;
  73. }
  74. private void ResetVelocityMeasurements()
  75. {
  76. this._velocityMeasurementStart = 0;
  77. this._velocityMeasurementCount = 0;
  78. }
  79. private void AddVelocityMeasurement(Vector2 position, float time)
  80. {
  81. if (this._velocityMeasurementCount == 3)
  82. {
  83. this._velocityMeasurementStart = (this._velocityMeasurementStart + 1) % 3;
  84. this._velocityMeasurementCount--;
  85. }
  86. int num = (this._velocityMeasurementStart + this._velocityMeasurementCount) % 3;
  87. this._velocityMeasurements[num].position = position;
  88. this._velocityMeasurements[num].time = time;
  89. this._velocityMeasurementCount++;
  90. }
  91. private Vector2 GetVelocity()
  92. {
  93. if (this._velocityMeasurementCount <= 1)
  94. {
  95. return Vector2.zero;
  96. }
  97. int num = (this._velocityMeasurementStart + this._velocityMeasurementCount - 1) % 3;
  98. Vector2 a = this._velocityMeasurements[num].position - this._velocityMeasurements[this._velocityMeasurementStart].position;
  99. float num2 = this._velocityMeasurements[num].time - this._velocityMeasurements[this._velocityMeasurementStart].time;
  100. if (Mathf.Approximately(num2, 0f))
  101. {
  102. return Vector2.zero;
  103. }
  104. return a / num2;
  105. }
  106. private void ProcessTouchInput()
  107. {
  108. Touch[] touches = Input.touches;
  109. for (int i = 0; i < touches.Length; i++)
  110. {
  111. MultiTouchInputModule.PreviousProcessedInputTime = Time.unscaledTime;
  112. PointerEventData pointerEventData;
  113. base.GetPointerData(touches[i].fingerId, out pointerEventData, false);
  114. if (pointerEventData == null)
  115. {
  116. if (this._dragPointerData.ContainsKey(touches[i].fingerId))
  117. {
  118. this._dragPointerData.Remove(touches[i].fingerId);
  119. this._pinchEventData.Pointers = this._dragPointerData.Count;
  120. this._pinchEventData.Center = this.FindPinchCenter(this._dragPointerData.Values);
  121. this._pinchEventData.Delta = Vector2.zero;
  122. this._pinchEventData.Distance = this.FindPinchDistance(this._dragPointerData.Values);
  123. this._pinchEventData.ScaleDelta = 1f;
  124. if (this._pinchEventData.Pointers == 0)
  125. {
  126. this._pinchEventData.Reset();
  127. GameObject target = this._pinchEventData.Target;
  128. BaseEventData pinchEventData = this._pinchEventData;
  129. if (MultiTouchInputModule._003C_003Ef__mg_0024cache0 == null)
  130. {
  131. MultiTouchInputModule._003C_003Ef__mg_0024cache0 = new ExecuteEvents.EventFunction<IEndPinchHandler>(MultiTouchInputModule.Execute);
  132. }
  133. ExecuteEvents.Execute<IEndPinchHandler>(target, pinchEventData, MultiTouchInputModule._003C_003Ef__mg_0024cache0);
  134. }
  135. else
  136. {
  137. this.ResetVelocityMeasurements();
  138. }
  139. }
  140. }
  141. else
  142. {
  143. bool flag = touches[i].phase == TouchPhase.Began;
  144. if (flag && pointerEventData.pointerDrag == null)
  145. {
  146. pointerEventData.pointerDrag = ExecuteEvents.GetEventHandler<IPinchHandler>(pointerEventData.pointerCurrentRaycast.gameObject);
  147. }
  148. if (pointerEventData.dragging && !this._dragPointerData.ContainsKey(pointerEventData.pointerId))
  149. {
  150. this._dragPointerData.Add(pointerEventData.pointerId, pointerEventData);
  151. this._pinchEventData.Pointers = this._dragPointerData.Count;
  152. this._pinchEventData.Center = this.FindPinchCenter(this._dragPointerData.Values);
  153. this._pinchEventData.Delta = Vector2.zero;
  154. this._pinchEventData.Velocity = Vector2.zero;
  155. this._pinchEventData.Distance = this.FindPinchDistance(this._dragPointerData.Values);
  156. this._pinchEventData.ScaleDelta = 1f;
  157. this.ResetVelocityMeasurements();
  158. if (this._pinchEventData.Pointers == 1)
  159. {
  160. this._pinchEventData.Target = pointerEventData.pointerPressRaycast.gameObject;
  161. if (this._pinchEventData.Target != null)
  162. {
  163. this._pinchEventData.Target = ExecuteEvents.GetEventHandler<IPinchHandler>(this._pinchEventData.Target);
  164. }
  165. this._pinchEventData.Reset();
  166. GameObject target2 = this._pinchEventData.Target;
  167. BaseEventData pinchEventData2 = this._pinchEventData;
  168. if (MultiTouchInputModule._003C_003Ef__mg_0024cache1 == null)
  169. {
  170. MultiTouchInputModule._003C_003Ef__mg_0024cache1 = new ExecuteEvents.EventFunction<IBeginPinchHandler>(MultiTouchInputModule.Execute);
  171. }
  172. ExecuteEvents.Execute<IBeginPinchHandler>(target2, pinchEventData2, MultiTouchInputModule._003C_003Ef__mg_0024cache1);
  173. }
  174. }
  175. if (pointerEventData.dragging && pointerEventData.eligibleForClick)
  176. {
  177. pointerEventData.eligibleForClick = false;
  178. }
  179. }
  180. }
  181. }
  182. private void ProcessTouchPinch()
  183. {
  184. Vector2 center = this._pinchEventData.Center;
  185. float distance = this._pinchEventData.Distance;
  186. if (this._pinchEventData.Pointers > 0)
  187. {
  188. this._pinchEventData.Center = this.FindPinchCenter(this._dragPointerData.Values);
  189. this._pinchEventData.Distance = this.FindPinchDistance(this._dragPointerData.Values);
  190. this.AddVelocityMeasurement(this._pinchEventData.Center, Time.unscaledTime);
  191. if (this._pinchEventData.Center != center || !Mathf.Approximately(this._pinchEventData.Distance, distance))
  192. {
  193. this._pinchEventData.Delta = this._pinchEventData.Center - center;
  194. this._pinchEventData.Velocity = this.GetVelocity();
  195. if (Math.Abs(distance) > 1E-09f)
  196. {
  197. this._pinchEventData.ScaleDelta = this._pinchEventData.Distance / distance;
  198. }
  199. else
  200. {
  201. this._pinchEventData.ScaleDelta = 1f;
  202. }
  203. this._pinchEventData.Reset();
  204. GameObject target = this._pinchEventData.Target;
  205. BaseEventData pinchEventData = this._pinchEventData;
  206. if (MultiTouchInputModule._003C_003Ef__mg_0024cache2 == null)
  207. {
  208. MultiTouchInputModule._003C_003Ef__mg_0024cache2 = new ExecuteEvents.EventFunction<IPinchHandler>(MultiTouchInputModule.Execute);
  209. }
  210. ExecuteEvents.Execute<IPinchHandler>(target, pinchEventData, MultiTouchInputModule._003C_003Ef__mg_0024cache2);
  211. }
  212. }
  213. }
  214. private const int MaxVelocityMeasurementCount = 3;
  215. private const float ScrollScaleFactor = 0.1f;
  216. private PinchEventData _pinchEventData;
  217. private MultiTouchInputModule.VelocityMeasurement[] _velocityMeasurements = new MultiTouchInputModule.VelocityMeasurement[3];
  218. private int _velocityMeasurementStart;
  219. private int _velocityMeasurementCount;
  220. private Dictionary<int, PointerEventData> _dragPointerData = new Dictionary<int, PointerEventData>();
  221. private bool _hasTouch;
  222. [CompilerGenerated]
  223. private static ExecuteEvents.EventFunction<IEndPinchHandler> _003C_003Ef__mg_0024cache0;
  224. [CompilerGenerated]
  225. private static ExecuteEvents.EventFunction<IBeginPinchHandler> _003C_003Ef__mg_0024cache1;
  226. [CompilerGenerated]
  227. private static ExecuteEvents.EventFunction<IPinchHandler> _003C_003Ef__mg_0024cache2;
  228. private struct VelocityMeasurement
  229. {
  230. public Vector2 position;
  231. public float time;
  232. }
  233. }