VirtualMouse.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using InfraredManager;
  2. using ProjectBase.Event;
  3. using ShotSimulator.Event;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using UnityEngine;
  7. using UnityEngine.EventSystems;
  8. using UnityEngine.UI;
  9. public enum CursorType
  10. {
  11. UICursor,
  12. DefaultCursor,
  13. SnipeCursor
  14. }
  15. public class VirtualMouse : MonoSingleton<VirtualMouse>
  16. {
  17. public Vector2 screenPos = new Vector2();
  18. public bool m_TacticalMode;
  19. public Camera m_SnipeCamera;
  20. private EventSystem m_eventSystem;
  21. private PointerEventData m_pointerEvent;
  22. private Selectable m_excluded;
  23. private Selectable m_currentSelectable;
  24. private RaycastResult m_currentRaycastResult;
  25. private IPointerClickHandler m_clickHandler;
  26. private IDragHandler m_dragHandler;
  27. public override void InitManager()
  28. {
  29. base.InitManager();
  30. m_eventSystem = EventSystem.current;
  31. m_pointerEvent = new PointerEventData(m_eventSystem);
  32. m_pointerEvent.button = PointerEventData.InputButton.Left;
  33. #if UNITY_ANDROID
  34. InfraredCameraHelper.GetInstance().OnPositionUpdate += OnPositionUpdate;
  35. #endif
  36. }
  37. private void OnDestroy()
  38. {
  39. InfraredCameraHelper.GetInstance().OnPositionUpdate -= OnPositionUpdate;
  40. }
  41. public bool IsSelectUIObject()
  42. {
  43. #if UNITY_EDITOR || UNITY_STANDALONE
  44. return EventSystem.current.IsPointerOverGameObject();
  45. #else
  46. return m_currentSelectable != null;
  47. #endif
  48. }
  49. private void OnPositionUpdate(Vector2 position, Vector2 cameraLocation)
  50. {
  51. screenPos = position;
  52. }
  53. private void UpdateSnipeCameraVisualAngle()
  54. {
  55. m_SnipeCamera.transform.LookAt(Camera.main.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, 50)));
  56. }
  57. void Update()
  58. {
  59. #if UNITY_EDITOR || UNITY_STANDALONE
  60. //screenPos = Input.mousePosition;
  61. #endif
  62. UpdateSnipeCameraVisualAngle();
  63. m_pointerEvent.position = screenPos;
  64. List<RaycastResult> raycastResults = new List<RaycastResult>();
  65. m_eventSystem.RaycastAll(m_pointerEvent, raycastResults);
  66. // Detect selectable
  67. if (raycastResults.Count > 0)
  68. {
  69. foreach (var result in raycastResults)
  70. {
  71. var newSelectable = result.gameObject.GetComponentInParent<Selectable>();
  72. if (newSelectable && newSelectable.interactable)
  73. {
  74. if (newSelectable != m_excluded && newSelectable != m_currentSelectable)
  75. {
  76. Select(newSelectable);
  77. m_currentRaycastResult = result;
  78. }
  79. break;
  80. }
  81. }
  82. }
  83. else
  84. {
  85. if (m_currentSelectable || m_excluded)
  86. {
  87. Select(null, null);
  88. }
  89. }
  90. if (Input.GetKeyDown(KeyCode.Space))
  91. {
  92. OnShooting(0);
  93. }
  94. }
  95. public void OnShooting(float speed)
  96. {
  97. if (m_currentSelectable)
  98. {
  99. if (m_clickHandler != null)
  100. {
  101. m_clickHandler.OnPointerClick(m_pointerEvent);
  102. Select(null, m_currentSelectable);
  103. }
  104. else if (m_dragHandler != null)
  105. {
  106. m_pointerEvent.pointerPressRaycast = m_currentRaycastResult;
  107. m_dragHandler.OnDrag(m_pointerEvent);
  108. }
  109. }
  110. }
  111. void Select(Selectable s, Selectable exclude = null)
  112. {
  113. m_excluded = exclude;
  114. if (m_currentSelectable)
  115. m_currentSelectable.OnPointerExit(m_pointerEvent);
  116. m_currentSelectable = s;
  117. if (m_currentSelectable)
  118. {
  119. m_currentSelectable.OnPointerEnter(m_pointerEvent);
  120. m_clickHandler = m_currentSelectable.GetComponent<IPointerClickHandler>();
  121. m_dragHandler = m_currentSelectable.GetComponent<IDragHandler>();
  122. }
  123. }
  124. }