UINavigator.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.SceneManagement;
  6. using UnityEngine.UI;
  7. public class UINavigator : MonoBehaviour
  8. {
  9. [SerializeField] string firstSelectButtonTagName = "EntryButton";
  10. float pulseRate = 8f;
  11. float amplitude = .2f;
  12. Image image = null;
  13. Color color;
  14. Selectable lastSelected;
  15. void OnEnable()
  16. {
  17. SceneManager.sceneLoaded += SelectFirstButton;
  18. }
  19. void OnDisable()
  20. {
  21. SceneManager.sceneLoaded -= SelectFirstButton;
  22. }
  23. void SelectFirstButton(Scene s, LoadSceneMode m)
  24. {
  25. StartCoroutine(SelectFirstButtonCoroutine());
  26. }
  27. IEnumerator SelectFirstButtonCoroutine()
  28. {
  29. if (!string.IsNullOrEmpty(firstSelectButtonTagName))
  30. {
  31. float startTime = Time.time;
  32. while (Time.time < startTime + 1f)
  33. {
  34. yield return new WaitForEndOfFrame();
  35. GameObject go = GameObject.FindGameObjectWithTag(firstSelectButtonTagName);
  36. if (go == null)
  37. {
  38. continue;
  39. }
  40. if (go.GetComponent<Selectable>() == null)
  41. {
  42. continue;
  43. }
  44. EventSystem.current.SetSelectedGameObject(go);
  45. break;
  46. }
  47. }
  48. }
  49. void Update()
  50. {
  51. EventSystem eventSys = EventSystem.current;
  52. // 鼠标点击取消
  53. if (Input.GetMouseButtonDown(0))
  54. {
  55. UnSelect();
  56. }
  57. if (Input.GetKeyDown(KeyCode.Escape))
  58. {
  59. Application.Quit();
  60. }
  61. if(eventSys.currentSelectedGameObject == null)
  62. {
  63. return;
  64. }
  65. Selectable selected = eventSys.currentSelectedGameObject?.GetComponent<Selectable>();
  66. if (selected != null && image != null)
  67. {
  68. float pulse = .5f + .5f * Mathf.Sin(Time.unscaledTime * pulseRate);
  69. float value = 1 - amplitude * pulse;
  70. Color col = color * value;
  71. col.a = 1f;
  72. image.color = col;
  73. //Debug.Log(selected.gameObject);
  74. }
  75. if (selected != lastSelected)
  76. {
  77. UnSelect();
  78. if (selected)
  79. {
  80. image = selected.GetComponent<Image>();
  81. if (image != null)
  82. {
  83. color = image.color;
  84. }
  85. }
  86. lastSelected = selected;
  87. }
  88. KeyCode keyCode = KeyCode.None;
  89. if (Input.GetKeyDown(KeyCode.LeftArrow))
  90. {
  91. keyCode = KeyCode.LeftArrow;
  92. }
  93. else if (Input.GetKeyDown(KeyCode.RightArrow))
  94. {
  95. keyCode = KeyCode.RightArrow;
  96. }
  97. else if (Input.GetKeyDown(KeyCode.UpArrow))
  98. {
  99. keyCode = KeyCode.UpArrow;
  100. }
  101. else if (Input.GetKeyDown(KeyCode.DownArrow))
  102. {
  103. keyCode = KeyCode.DownArrow;
  104. }
  105. if (keyCode != KeyCode.None)
  106. {
  107. // 没有已选择的UI,寻找第一个
  108. if (selected == null || !selected.isActiveAndEnabled)
  109. {
  110. Selectable firstSelectable = FindObjectOfType<Selectable>();
  111. if (firstSelectable != null)
  112. {
  113. eventSys.SetSelectedGameObject(firstSelectable.gameObject);
  114. }
  115. }
  116. // 通过已选择的UI,寻找下一个
  117. else
  118. {
  119. switch (keyCode)
  120. {
  121. case KeyCode.LeftArrow:
  122. selected = selected.FindSelectableOnLeft();
  123. break;
  124. case KeyCode.RightArrow:
  125. selected = selected.FindSelectableOnRight();
  126. break;
  127. case KeyCode.UpArrow:
  128. selected = selected.FindSelectableOnUp();
  129. break;
  130. case KeyCode.DownArrow:
  131. selected = selected.FindSelectableOnDown();
  132. break;
  133. }
  134. }
  135. }
  136. }
  137. void UnSelect()
  138. {
  139. if (image != null)
  140. {
  141. image.color = color;
  142. image = null;
  143. }
  144. }
  145. }