KeyBoardSelector.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6. using System.Linq;
  7. public class KeyBoardSelector : MonoBehaviour
  8. {
  9. Button _lastSelectBtn;
  10. List<Button> _selectables = new();
  11. EventSystem _eventSystem;
  12. PointerEventData _pointerEventData;
  13. public bool doing = false;
  14. public static KeyBoardSelector ins;
  15. void Start()
  16. {
  17. ins = this;
  18. _eventSystem = FindObjectOfType<EventSystem>();
  19. _pointerEventData = new PointerEventData(_eventSystem);
  20. gameObject.AddComponent<KeyBoardInterface>();
  21. }
  22. void Update()
  23. {
  24. if (doing)
  25. {
  26. RefreshLastSelectBtn();
  27. if (!IsLastBtnValid()) Quit();
  28. }
  29. }
  30. public void Quit()
  31. {
  32. doing = false;
  33. SB_EventSystem.ins.mouseConfirm.Hide();
  34. }
  35. public void Enter()
  36. {
  37. RefreshLastSelectBtn();
  38. SB_EventSystem.ins.mouseConfirm.OnClikc_Confirm(false);
  39. }
  40. public void HandleInput(int delta)
  41. {
  42. doing = true;
  43. RefreshLastSelectBtn();
  44. UpdateSelectables();
  45. if (IsLastBtnValid())
  46. {
  47. Button nextOne = KeyBoardNavigation.Next(_lastSelectBtn, delta);
  48. if (nextOne == null) return;
  49. _lastSelectBtn = nextOne;
  50. SB_EventSystem.ins.mouseConfirm.SetSelectable(_lastSelectBtn);
  51. }
  52. else
  53. {
  54. if (_selectables.Count > 0)
  55. {
  56. Button nextOne = KeyBoardNavigation.Next(_selectables[0], delta, true);
  57. if (nextOne == null) return;
  58. _lastSelectBtn = nextOne;
  59. SB_EventSystem.ins.mouseConfirm.SetSelectable(_lastSelectBtn);
  60. }
  61. }
  62. }
  63. void UpdateSelectables()
  64. {
  65. _selectables.Clear();
  66. Button[] buttons = FindObjectsOfType<Button>();
  67. List<RaycastResult> raycastResults = new List<RaycastResult>();
  68. foreach (var btn in buttons)
  69. {
  70. if (!btn.interactable) continue;
  71. _pointerEventData.position = JCUnityLib.RectTransformUtils.GetPositionByPivot(btn.transform as RectTransform, Vector2.one * 0.5f);
  72. _eventSystem.RaycastAll(_pointerEventData, raycastResults);
  73. Selectable selectable;
  74. if (raycastResults.Count > 0 && raycastResults[0].gameObject && (selectable = raycastResults[0].gameObject.GetComponentInParent<Selectable>()) && selectable == btn && KeyBoardNavigation.IsNavigationButton(selectable.GetComponent<Button>()))
  75. {
  76. _selectables.Add(btn);
  77. }
  78. }
  79. }
  80. bool IsLastBtnValid()
  81. {
  82. if (!_lastSelectBtn) return false;
  83. if (!_lastSelectBtn.interactable) return false;
  84. List<RaycastResult> raycastResults = new List<RaycastResult>();
  85. _pointerEventData.position = JCUnityLib.RectTransformUtils.GetPositionByPivot(_lastSelectBtn.transform as RectTransform, Vector2.one * 0.5f);
  86. _eventSystem.RaycastAll(_pointerEventData, raycastResults);
  87. Selectable selectable;
  88. if (raycastResults.Count > 0 && raycastResults[0].gameObject && (selectable = raycastResults[0].gameObject.GetComponentInParent<Selectable>()) && selectable == _lastSelectBtn && KeyBoardNavigation.IsNavigationButton(selectable.GetComponent<Button>()))
  89. {
  90. return true;
  91. }
  92. return false;
  93. }
  94. void RefreshLastSelectBtn()
  95. {
  96. if (SB_EventSystem.ins.mouseConfirm._targetSelectable) _lastSelectBtn = SB_EventSystem.ins.mouseConfirm._targetSelectable.GetComponent<Button>();
  97. else _lastSelectBtn = null;
  98. }
  99. }
  100. //public class KeyBoardSelector : MonoBehaviour
  101. //{
  102. // Button _lastSelectBtn;
  103. // List<Button> _selectables = new();
  104. // EventSystem _eventSystem;
  105. // PointerEventData _pointerEventData;
  106. // public bool doing = false;
  107. // public static KeyBoardSelector ins;
  108. // void Start()
  109. // {
  110. // ins = this;
  111. // _eventSystem = FindObjectOfType<EventSystem>();
  112. // _pointerEventData = new PointerEventData(_eventSystem);
  113. // gameObject.AddComponent<KeyBoardInterface>();
  114. // }
  115. // void Update()
  116. // {
  117. // if (doing)
  118. // {
  119. // RefreshLastSelectBtn();
  120. // if (!IsLastBtnValid()) Quit();
  121. // }
  122. // }
  123. // public void Quit()
  124. // {
  125. // doing = false;
  126. // SB_EventSystem.ins.mouseConfirm.Hide();
  127. // }
  128. // public void Enter()
  129. // {
  130. // RefreshLastSelectBtn();
  131. // SB_EventSystem.ins.mouseConfirm.OnClikc_Confirm(false);
  132. // }
  133. // public void HandleInput(Vector2 pointer)
  134. // {
  135. // doing = true;
  136. // RefreshLastSelectBtn();
  137. // UpdateSelectables();
  138. // if (IsLastBtnValid())
  139. // {
  140. // Vector2 curPos = JCUnityLib.RectTransformUtils.GetPositionByPivot(_lastSelectBtn.transform as RectTransform, Vector2.one * 0.5f);
  141. // var selectableList = _selectables.FindAll(b => b != _lastSelectBtn && Vector2.Angle(pointer, (Vector2)JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f) - curPos) <= 45);
  142. // if (selectableList.Count == 0)
  143. // {
  144. // //重新筛选
  145. // _selectables = _selectables.FindAll(b => b != _lastSelectBtn && Vector2.Angle(pointer, (Vector2)JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f) - curPos) <= 80);
  146. // _selectables = _selectables.OrderBy(b => Vector2.Angle(pointer, (Vector2)JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f) - curPos))
  147. // .ThenBy(b => Vector2.Distance(JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f), curPos))
  148. // .ToList();
  149. // }
  150. // else
  151. // {
  152. // _selectables = selectableList.OrderBy(b => Vector2.Distance(JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f), curPos)).ToList();
  153. // }
  154. // if (_selectables.Count > 0)
  155. // {
  156. // _lastSelectBtn = _selectables[0];
  157. // SB_EventSystem.ins.mouseConfirm.SetSelectable(_lastSelectBtn);
  158. // }
  159. // }
  160. // else
  161. // {
  162. // if (_selectables.Count > 0)
  163. // {
  164. // Vector2 centerPoint = new Vector2(Screen.width, Screen.height) / 2f;
  165. // _selectables.Sort((a, b) =>
  166. // {
  167. // return Vector2.Distance(a.transform.position, centerPoint) - Vector2.Distance(b.transform.position, centerPoint) < 0 ? -1 : 1;
  168. // });
  169. // _lastSelectBtn = _selectables[0];
  170. // SB_EventSystem.ins.mouseConfirm.SetSelectable(_lastSelectBtn);
  171. // }
  172. // }
  173. // }
  174. // void UpdateSelectables()
  175. // {
  176. // _selectables.Clear();
  177. // Button[] buttons = FindObjectsOfType<Button>();
  178. // List<RaycastResult> raycastResults = new List<RaycastResult>();
  179. // foreach (var btn in buttons)
  180. // {
  181. // if (!btn.interactable) continue;
  182. // _pointerEventData.position = JCUnityLib.RectTransformUtils.GetPositionByPivot(btn.transform as RectTransform, Vector2.one * 0.5f);
  183. // _eventSystem.RaycastAll(_pointerEventData, raycastResults);
  184. // Selectable selectable;
  185. // if (raycastResults.Count > 0 && raycastResults[0].gameObject && (selectable = raycastResults[0].gameObject.GetComponentInParent<Selectable>()) && selectable == btn)
  186. // {
  187. // _selectables.Add(btn);
  188. // }
  189. // }
  190. // }
  191. // bool IsLastBtnValid()
  192. // {
  193. // if (!_lastSelectBtn) return false;
  194. // if (!_lastSelectBtn.interactable) return false;
  195. // List<RaycastResult> raycastResults = new List<RaycastResult>();
  196. // _pointerEventData.position = JCUnityLib.RectTransformUtils.GetPositionByPivot(_lastSelectBtn.transform as RectTransform, Vector2.one * 0.5f);
  197. // _eventSystem.RaycastAll(_pointerEventData, raycastResults);
  198. // Selectable selectable;
  199. // if (raycastResults.Count > 0 && raycastResults[0].gameObject && (selectable = raycastResults[0].gameObject.GetComponentInParent<Selectable>()) && selectable == _lastSelectBtn)
  200. // {
  201. // return true;
  202. // }
  203. // return false;
  204. // }
  205. // void RefreshLastSelectBtn()
  206. // {
  207. // if (SB_EventSystem.ins.mouseConfirm._targetSelectable) _lastSelectBtn = SB_EventSystem.ins.mouseConfirm._targetSelectable.GetComponent<Button>();
  208. // else _lastSelectBtn = null;
  209. // }
  210. //}