HandInputModule.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. using EZXR.Glass.Inputs;
  2. using System;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.Serialization;
  6. using UnityEngine.UI;
  7. namespace UnityEngine.EventSystems
  8. {
  9. [AddComponentMenu("Event/Hand Input Module")]
  10. /// <summary>
  11. /// A BaseInputModule designed for mouse / keyboard / controller input.
  12. /// </summary>
  13. /// <remarks>
  14. /// Input module for working with, mouse, keyboard, or controller.
  15. /// </remarks>
  16. public class HandInputModule : PointerInputModule
  17. {
  18. Button curPointerHover;
  19. Button lastPointerHover;
  20. public static Action<Button> OnPointerHover;
  21. public static Action<Button> OnPointerExit;
  22. public static Touch[] touches = new Touch[2];
  23. //public static Dictionary<int, HandInfoBase> handInfoPairs = new Dictionary<int, HandInfoBase>();
  24. private static Vector2[] inputMousePosition = new Vector2[1];
  25. private Vector2 m_MousePosition;
  26. private GameObject m_CurrentFocusedGameObject;
  27. private PointerEventData m_InputPointerEvent;
  28. public static PointerEventData eventData_Left;
  29. public static PointerEventData eventData_Right;
  30. protected HandInputModule()
  31. {
  32. }
  33. protected override void Awake()
  34. {
  35. base.Awake();
  36. touches[0].fingerId = (int)HandType.Left;
  37. touches[1].fingerId = (int)HandType.Right;
  38. /*
  39. if (controllerType == ControllerType.Gestures)
  40. {
  41. handInfoPairs.Add(finger_left, InputSystem.leftHand);
  42. handInfoPairs.Add(finger_right, InputSystem.rightHand);
  43. Debug.Log("HandInputModule, Init handInfoPairs with HandInfo (use Gestures)");
  44. }
  45. else
  46. {
  47. handInfoPairs.Add(finger_left, HandleControllerManager.leftHand);
  48. handInfoPairs.Add(finger_right, HandleControllerManager.rightHand);
  49. Debug.Log("HandInputModule, Init handInfoPairs with HandleControllerInfo (use Handles)");
  50. }
  51. */
  52. }
  53. private void Update()
  54. {
  55. GetPointerData(0, out eventData_Left, false);
  56. GetPointerData(1, out eventData_Right, false);
  57. Button newPointerHover = null;
  58. if (eventData_Left != null && eventData_Left.pointerEnter != null)
  59. {
  60. newPointerHover = eventData_Left.pointerEnter.GetComponent<Button>();
  61. }
  62. if (eventData_Right != null && eventData_Right.pointerEnter != null)
  63. {
  64. newPointerHover = eventData_Right.pointerEnter.GetComponent<Button>();
  65. }
  66. if (newPointerHover != null && newPointerHover != curPointerHover)
  67. {
  68. if (OnPointerHover != null)
  69. {
  70. OnPointerHover(newPointerHover);
  71. }
  72. if (OnPointerExit != null)
  73. {
  74. OnPointerExit(curPointerHover);
  75. }
  76. lastPointerHover = curPointerHover;
  77. curPointerHover = newPointerHover;
  78. }
  79. }
  80. [Obsolete("Mode is no longer needed on input module as it handles both mouse and keyboard simultaneously.", false)]
  81. public enum InputMode
  82. {
  83. Mouse,
  84. Buttons
  85. }
  86. [Obsolete("Mode is no longer needed on input module as it handles both mouse and keyboard simultaneously.", false)]
  87. public InputMode inputMode
  88. {
  89. get { return InputMode.Mouse; }
  90. }
  91. [SerializeField]
  92. [FormerlySerializedAs("m_AllowActivationOnMobileDevice")]
  93. private bool m_ForceModuleActive;
  94. [Obsolete("allowActivationOnMobileDevice has been deprecated. Use forceModuleActive instead (UnityUpgradable) -> forceModuleActive")]
  95. public bool allowActivationOnMobileDevice
  96. {
  97. get { return m_ForceModuleActive; }
  98. set { m_ForceModuleActive = value; }
  99. }
  100. /// <summary>
  101. /// Force this module to be active.
  102. /// </summary>
  103. /// <remarks>
  104. /// If there is no module active with higher priority (ordered in the inspector) this module will be forced active even if valid enabling conditions are not met.
  105. /// </remarks>
  106. public bool forceModuleActive
  107. {
  108. get { return m_ForceModuleActive; }
  109. set { m_ForceModuleActive = value; }
  110. }
  111. private bool m_shouldActivate;
  112. public bool shouldActivate
  113. {
  114. get { return m_shouldActivate; }
  115. set { m_shouldActivate = value; }
  116. }
  117. private bool ShouldIgnoreEventsOnNoFocus()
  118. {
  119. switch (SystemInfo.operatingSystemFamily)
  120. {
  121. case OperatingSystemFamily.Windows:
  122. case OperatingSystemFamily.Linux:
  123. case OperatingSystemFamily.MacOSX:
  124. #if UNITY_EDITOR
  125. if (UnityEditor.EditorApplication.isRemoteConnected)
  126. return false;
  127. #endif
  128. return true;
  129. default:
  130. return false;
  131. }
  132. }
  133. public override void UpdateModule()
  134. {
  135. if (!eventSystem.isFocused && ShouldIgnoreEventsOnNoFocus())
  136. {
  137. if (m_InputPointerEvent != null && m_InputPointerEvent.pointerDrag != null && m_InputPointerEvent.dragging)
  138. {
  139. ReleaseMouse(m_InputPointerEvent, m_InputPointerEvent.pointerCurrentRaycast.gameObject);
  140. }
  141. m_InputPointerEvent = null;
  142. return;
  143. }
  144. m_MousePosition = inputMousePosition[0];
  145. }
  146. private void ReleaseMouse(PointerEventData pointerEvent, GameObject currentOverGo)
  147. {
  148. ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler);
  149. var pointerUpHandler = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
  150. // PointerClick and Drop events
  151. if (pointerEvent.pointerPress == pointerUpHandler && pointerEvent.eligibleForClick)
  152. {
  153. ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerClickHandler);
  154. }
  155. else if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
  156. {
  157. ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.dropHandler);
  158. }
  159. pointerEvent.eligibleForClick = false;
  160. pointerEvent.pointerPress = null;
  161. pointerEvent.rawPointerPress = null;
  162. if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
  163. ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler);
  164. pointerEvent.dragging = false;
  165. pointerEvent.pointerDrag = null;
  166. // redo pointer enter / exit to refresh state
  167. // so that if we moused over something that ignored it before
  168. // due to having pressed on something else
  169. // it now gets it.
  170. if (currentOverGo != pointerEvent.pointerEnter)
  171. {
  172. HandlePointerExitAndEnter(pointerEvent, null);
  173. HandlePointerExitAndEnter(pointerEvent, currentOverGo);
  174. }
  175. m_InputPointerEvent = pointerEvent;
  176. }
  177. public override bool IsModuleSupported()
  178. {
  179. return true /*|| input.mousePresent || input.touchSupported*/;
  180. }
  181. public override bool ShouldActivateModule()
  182. {
  183. if (!base.ShouldActivateModule())
  184. return false;
  185. var shouldActivate = m_ForceModuleActive;
  186. //shouldActivate |= input.GetButtonDown(m_SubmitButton);
  187. //shouldActivate |= input.GetButtonDown(m_CancelButton);
  188. //shouldActivate |= !Mathf.Approximately(input.GetAxisRaw(m_HorizontalAxis), 0.0f);
  189. //shouldActivate |= !Mathf.Approximately(input.GetAxisRaw(m_VerticalAxis), 0.0f);
  190. //shouldActivate |= (m_MousePosition - m_LastMousePosition).sqrMagnitude > 0.0f;
  191. //shouldActivate |= input.GetMouseButtonDown(0);
  192. //if (input.touchCount > 0)
  193. // shouldActivate = true;
  194. //return shouldActivate;
  195. return m_shouldActivate;
  196. }
  197. /// <summary>
  198. /// See BaseInputModule.
  199. /// </summary>
  200. public override void ActivateModule()
  201. {
  202. if (!eventSystem.isFocused && ShouldIgnoreEventsOnNoFocus())
  203. return;
  204. base.ActivateModule();
  205. m_MousePosition = inputMousePosition[0];
  206. var toSelect = eventSystem.currentSelectedGameObject;
  207. if (toSelect == null)
  208. toSelect = eventSystem.firstSelectedGameObject;
  209. eventSystem.SetSelectedGameObject(toSelect, GetBaseEventData());
  210. }
  211. /// <summary>
  212. /// See BaseInputModule.
  213. /// </summary>
  214. public override void DeactivateModule()
  215. {
  216. base.DeactivateModule();
  217. ClearSelection();
  218. }
  219. public override void Process()
  220. {
  221. if (!eventSystem.isFocused && ShouldIgnoreEventsOnNoFocus())
  222. return;
  223. //>>>>>>>>>>>!!!!!!!!! //if (!ProcessTouchEvents() && input.mousePresent)
  224. //ProcessMouseEvent(0);
  225. ProcessTouchEvents();
  226. }
  227. private bool ProcessTouchEvents()
  228. {
  229. for (int i = 0; i < touches.Length; ++i)
  230. {
  231. Touch touch = touches[i];
  232. if (touch.type == TouchType.Indirect)
  233. continue;
  234. bool released;
  235. bool pressed;
  236. var pointer = GetHandPointerTouchEventData(touch, out pressed, out released);
  237. ProcessTouchPress(pointer, pressed, released, touch.fingerId == 0 ? EZXR.Glass.Inputs.InputSystem.leftHand : EZXR.Glass.Inputs.InputSystem.rightHand);
  238. if (!released)
  239. {
  240. ProcessMove(pointer);
  241. ProcessDrag(pointer);
  242. }
  243. else
  244. RemovePointerData(pointer);
  245. }
  246. return touches.Length > 0;
  247. }
  248. PointerEventData GetHandPointerTouchEventData(Touch input, out bool pressed, out bool released)
  249. {
  250. PointerEventData pointerData;
  251. var created = GetPointerData(input.fingerId, out pointerData, true);
  252. pointerData.Reset();
  253. var handInfo = input.fingerId == (int)HandType.Left ? EZXR.Glass.Inputs.InputSystem.leftHand : EZXR.Glass.Inputs.InputSystem.rightHand;
  254. if (handInfo != null)
  255. {
  256. pressed = handInfo.startPinch;
  257. released = handInfo.endPinch;
  258. }
  259. else
  260. {
  261. pressed = false;
  262. released = false;
  263. }
  264. //pressed = (input.fingerId == (int)HandType.Left ? ControllerManager.leftHand : ControllerManager.rightHand).startPinch;
  265. //released = (input.fingerId == (int)HandType.Left ? ControllerManager.leftHand : ControllerManager.rightHand).endPinch;
  266. if (created)
  267. pointerData.position = input.position;
  268. if (pressed)
  269. pointerData.delta = Vector2.zero;
  270. else
  271. pointerData.delta = input.position - pointerData.position;
  272. pointerData.position = input.position;
  273. pointerData.button = PointerEventData.InputButton.Left;
  274. if (input.phase == TouchPhase.Canceled)
  275. {
  276. pointerData.pointerCurrentRaycast = new RaycastResult();
  277. }
  278. else
  279. {
  280. eventSystem.RaycastAll(pointerData, m_RaycastResultCache);
  281. var raycast = FindFirstRaycast(m_RaycastResultCache);
  282. pointerData.pointerCurrentRaycast = raycast;
  283. //if (raycast.gameObject != null)
  284. // Debug.Log($"HandControllerSession, Raycast = {raycast.gameObject.name}, screenPosition = ({pointerData.position.x}, {pointerData.position.y})");
  285. m_RaycastResultCache.Clear();
  286. }
  287. return pointerData;
  288. }
  289. /// <summary>
  290. /// This method is called by Unity whenever a touch event is processed. Override this method with a custom implementation to process touch events yourself.
  291. /// </summary>
  292. /// <param name="pointerEvent">Event data relating to the touch event, such as position and ID to be passed to the touch event destination object.</param>
  293. /// <param name="pressed">This is true for the first frame of a touch event, and false thereafter. This can therefore be used to determine the instant a touch event occurred.</param>
  294. /// <param name="released">This is true only for the last frame of a touch event.</param>
  295. /// <remarks>
  296. /// This method can be overridden in derived classes to change how touch press events are handled.
  297. /// </remarks>
  298. protected void ProcessTouchPress(PointerEventData pointerEvent, bool pressed, bool released, InputInfoBase inputInfo)
  299. {
  300. var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject;
  301. // PointerDown notification
  302. if (pressed)
  303. {
  304. pointerEvent.eligibleForClick = true;
  305. pointerEvent.delta = Vector2.zero;
  306. pointerEvent.dragging = false;
  307. pointerEvent.useDragThreshold = true;
  308. pointerEvent.pressPosition = pointerEvent.position;
  309. pointerEvent.pointerPressRaycast = pointerEvent.pointerCurrentRaycast;
  310. DeselectIfSelectionChanged(currentOverGo, pointerEvent);
  311. if (pointerEvent.pointerEnter != currentOverGo)
  312. {
  313. // send a pointer enter to the touched element if it isn't the one to select...
  314. HandlePointerExitAndEnter(pointerEvent, currentOverGo);
  315. pointerEvent.pointerEnter = currentOverGo;
  316. }
  317. // search for the control that will receive the press
  318. // if we can't find a press handler set the press
  319. // handler to be what would receive a click.
  320. var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.pointerDownHandler);
  321. // didnt find a press handler... search for a click handler
  322. if (newPressed == null)
  323. newPressed = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
  324. // Debug.Log("Pressed: " + newPressed);
  325. float time = Time.unscaledTime;
  326. if (newPressed == pointerEvent.lastPress)
  327. {
  328. var diffTime = time - pointerEvent.clickTime;
  329. if (diffTime < 0.3f)
  330. ++pointerEvent.clickCount;
  331. else
  332. pointerEvent.clickCount = 1;
  333. pointerEvent.clickTime = time;
  334. }
  335. else
  336. {
  337. pointerEvent.clickCount = 1;
  338. }
  339. pointerEvent.pointerPress = newPressed;
  340. pointerEvent.rawPointerPress = currentOverGo;
  341. pointerEvent.clickTime = time;
  342. // Save the drag handler as well
  343. pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(currentOverGo);
  344. if (pointerEvent.pointerDrag != null)
  345. ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag);
  346. m_InputPointerEvent = pointerEvent;
  347. }
  348. // PointerUp notification
  349. if (released)
  350. {
  351. #if SYSTEMUI
  352. #region 在松开手指的时候向当前指向的物体发送press事件
  353. if (inputInfo.isPalmFacingHead())
  354. {
  355. // search for the control that will receive the press
  356. // if we can't find a press handler set the press
  357. // handler to be what would receive a click.
  358. var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.pointerDownHandler);
  359. // didnt find a press handler... search for a click handler
  360. if (newPressed == null)
  361. newPressed = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
  362. pointerEvent.pointerPress = newPressed;
  363. pointerEvent.rawPointerPress = currentOverGo;
  364. }
  365. #endregion
  366. #endif
  367. // Debug.Log("Executing pressup on: " + pointer.pointerPress);
  368. ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler);
  369. // Debug.Log("KeyCode: " + pointer.eventData.keyCode);
  370. // see if we mouse up on the same element that we clicked on...
  371. var pointerUpHandler = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
  372. #if SYSTEMUI
  373. pointerEvent.pointerPress = pointerUpHandler;
  374. #endif
  375. // PointerClick and Drop events
  376. if (/*pointerEvent.pointerPress == pointerUpHandler &&*/ pointerEvent.eligibleForClick)
  377. {
  378. ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerClickHandler);
  379. }
  380. if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
  381. {
  382. ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.dropHandler);
  383. }
  384. pointerEvent.eligibleForClick = false;
  385. pointerEvent.pointerPress = null;
  386. pointerEvent.rawPointerPress = null;
  387. if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
  388. ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler);
  389. pointerEvent.dragging = false;
  390. pointerEvent.pointerDrag = null;
  391. // send exit events as we need to simulate this on touch up on touch device
  392. ExecuteEvents.ExecuteHierarchy(pointerEvent.pointerEnter, pointerEvent, ExecuteEvents.pointerExitHandler);
  393. pointerEvent.pointerEnter = null;
  394. m_InputPointerEvent = pointerEvent;
  395. }
  396. }
  397. /// <summary>
  398. /// Process all mouse events.
  399. /// </summary>
  400. protected void ProcessMouseEvent(int id)
  401. {
  402. var mouseData = GetHandMousePointerEventData(id);
  403. var leftButtonData = mouseData.GetButtonState(PointerEventData.InputButton.Left).eventData;
  404. m_CurrentFocusedGameObject = leftButtonData.buttonData.pointerCurrentRaycast.gameObject;
  405. // Process the first mouse button fully
  406. ProcessMousePress(leftButtonData);
  407. ProcessMove(leftButtonData.buttonData);
  408. ProcessDrag(leftButtonData.buttonData);
  409. //// Now process right / middle clicks
  410. //ProcessMousePress(mouseData.GetButtonState(PointerEventData.InputButton.Right).eventData);
  411. //ProcessDrag(mouseData.GetButtonState(PointerEventData.InputButton.Right).eventData.buttonData);
  412. //ProcessMousePress(mouseData.GetButtonState(PointerEventData.InputButton.Middle).eventData);
  413. //ProcessDrag(mouseData.GetButtonState(PointerEventData.InputButton.Middle).eventData.buttonData);
  414. }
  415. protected override void ProcessMove(PointerEventData pointerEvent)
  416. {
  417. var targetGO = pointerEvent.pointerCurrentRaycast.gameObject;
  418. HandlePointerExitAndEnter(pointerEvent, targetGO);
  419. }
  420. /// <summary>
  421. /// Return the current MouseState.
  422. /// </summary>
  423. protected virtual MouseState GetHandMousePointerEventData(int id)
  424. {
  425. // Populate the left button...
  426. PointerEventData leftData;
  427. var created = GetPointerData(kMouseLeftId, out leftData, true);
  428. leftData.Reset();
  429. if (created)
  430. leftData.position = inputMousePosition[0];
  431. Vector2 pos = inputMousePosition[0];
  432. leftData.delta = pos - leftData.position;
  433. //Debug.Log(pos.ToString("#.####") + "�� " + leftData.position.ToString("#.####") + ", " + leftData.delta.y);
  434. leftData.position = pos;
  435. leftData.scrollDelta = Vector2.zero;// input.mouseScrollDelta;
  436. leftData.button = PointerEventData.InputButton.Left;
  437. eventSystem.RaycastAll(leftData, m_RaycastResultCache);
  438. var raycast = FindFirstRaycast(m_RaycastResultCache);
  439. leftData.pointerCurrentRaycast = raycast;
  440. m_RaycastResultCache.Clear();
  441. //// copy the apropriate data into right and middle slots
  442. //PointerEventData rightData;
  443. //GetPointerData(kMouseRightId, out rightData, true);
  444. //CopyFromTo(leftData, rightData);
  445. //rightData.button = PointerEventData.InputButton.Right;
  446. //PointerEventData middleData;
  447. //GetPointerData(kMouseMiddleId, out middleData, true);
  448. //CopyFromTo(leftData, middleData);
  449. //middleData.button = PointerEventData.InputButton.Middle;
  450. MouseState m_MouseState = new MouseState();
  451. m_MouseState.SetButtonState(PointerEventData.InputButton.Left, StateForHandMouseButton(0), leftData);
  452. //m_MouseState.SetButtonState(PointerEventData.InputButton.Right, StateForMouseButton(1), rightData);
  453. //m_MouseState.SetButtonState(PointerEventData.InputButton.Middle, StateForMouseButton(2), middleData);
  454. return m_MouseState;
  455. }
  456. /// <summary>
  457. /// Given a mouse button return the current state for the frame.
  458. /// </summary>
  459. /// <param name="buttonId">Mouse button ID</param>
  460. protected PointerEventData.FramePressState StateForHandMouseButton(int buttonId)
  461. {
  462. //#if UNITY_EDITOR
  463. // var pressed = input.GetMouseButtonDown(buttonId);
  464. // var released = input.GetMouseButtonUp(buttonId);
  465. //#else
  466. bool pressed = /*EZXR.Glass.Inputs.InputSystem.leftHand.startPinch || */EZXR.Glass.Inputs.InputSystem.leftHand.startPinch;
  467. bool released = /*EZXR.Glass.Inputs.InputSystem.leftHand.endPinch || */EZXR.Glass.Inputs.InputSystem.leftHand.endPinch;
  468. //#endif
  469. if (pressed && released)
  470. return PointerEventData.FramePressState.PressedAndReleased;
  471. if (pressed)
  472. return PointerEventData.FramePressState.Pressed;
  473. if (released)
  474. return PointerEventData.FramePressState.Released;
  475. return PointerEventData.FramePressState.NotChanged;
  476. }
  477. /// <summary>
  478. /// Calculate and process any mouse button state changes.
  479. /// </summary>
  480. protected void ProcessMousePress(MouseButtonEventData data)
  481. {
  482. var pointerEvent = data.buttonData;
  483. var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject;
  484. // PointerDown notification
  485. if (data.PressedThisFrame())
  486. {
  487. //Debug.Log("data.PressedThisFrame");
  488. pointerEvent.eligibleForClick = true;
  489. pointerEvent.delta = Vector2.zero;
  490. pointerEvent.dragging = false;
  491. pointerEvent.useDragThreshold = true;
  492. pointerEvent.pressPosition = pointerEvent.position;
  493. pointerEvent.pointerPressRaycast = pointerEvent.pointerCurrentRaycast;
  494. DeselectIfSelectionChanged(currentOverGo, pointerEvent);
  495. // search for the control that will receive the press
  496. // if we can't find a press handler set the press
  497. // handler to be what would receive a click.
  498. var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.pointerDownHandler);
  499. // didnt find a press handler... search for a click handler
  500. if (newPressed == null)
  501. newPressed = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
  502. // Debug.Log("Pressed: " + newPressed);
  503. float time = Time.unscaledTime;
  504. if (newPressed == pointerEvent.lastPress)
  505. {
  506. var diffTime = time - pointerEvent.clickTime;
  507. if (diffTime < 0.3f)
  508. ++pointerEvent.clickCount;
  509. else
  510. pointerEvent.clickCount = 1;
  511. pointerEvent.clickTime = time;
  512. }
  513. else
  514. {
  515. pointerEvent.clickCount = 1;
  516. }
  517. pointerEvent.pointerPress = newPressed;
  518. pointerEvent.rawPointerPress = currentOverGo;
  519. pointerEvent.clickTime = time;
  520. // Save the drag handler as well
  521. pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(currentOverGo);
  522. if (pointerEvent.pointerDrag != null)
  523. ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag);
  524. m_InputPointerEvent = pointerEvent;
  525. }
  526. // PointerUp notification
  527. if (data.ReleasedThisFrame())
  528. {
  529. ReleaseMouse(pointerEvent, currentOverGo);
  530. }
  531. }
  532. protected GameObject GetCurrentFocusedGameObject()
  533. {
  534. return m_CurrentFocusedGameObject;
  535. }
  536. }
  537. }