MenuController.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Unity.VisualScripting;
  5. using UnityEngine;
  6. using UnityEngine.SceneManagement;
  7. using UnityEngine.UIElements;
  8. /* 本文件控制游戏右侧的菜单按键逻辑
  9. */
  10. public class MenuController : MonoBehaviour
  11. {
  12. // Start is called once before the first execution of Update after the MonoBehaviour is created
  13. private VisualElement mainMenu;
  14. private List<VisualElement> subMenus = new();
  15. //private bool isSubMenuShow = false;
  16. private GameObject uiPlaceholder; // Manu会控制其他子菜单显示和隐藏,因此所有子菜单都必须挂载在UI Placeholder下
  17. private GameObject vamUI; // vamUI = Voice and Manu UI;
  18. private GameObject shoppingUI, statusUI, warehouseUI; // 对应点击菜单后展开的几个子菜单
  19. void OnEnable()
  20. {
  21. Debug.Log("manu controller start");
  22. uiPlaceholder = GameObject.Find("UI Placeholder");
  23. vamUI = uiPlaceholder.transform.Find("VoiceAndMenu").gameObject;
  24. shoppingUI = uiPlaceholder.transform.Find("ShoppingUI").gameObject;
  25. statusUI = uiPlaceholder.transform.Find("Status").gameObject;
  26. warehouseUI = uiPlaceholder.transform.Find("Warehouse").gameObject;
  27. var root = GetComponent<UIDocument>().rootVisualElement;
  28. var menuArea = root.Q<VisualElement>("menuArea");
  29. mainMenu = menuArea.Q<VisualElement>("mainMenu");
  30. var home = menuArea.Q<VisualElement>("home");
  31. subMenus.Add(home);
  32. var playground = menuArea.Q<VisualElement>("playground");
  33. subMenus.Add(playground);
  34. var shop = menuArea.Q<VisualElement>("shop");
  35. subMenus.Add(shop);
  36. var warehouse = menuArea.Q<VisualElement>("warehouse");
  37. subMenus.Add(warehouse);
  38. var cameraBtn = menuArea.Q<VisualElement>("camera");
  39. subMenus.Add(cameraBtn);
  40. var status = menuArea.Q<VisualElement>("status");
  41. subMenus.Add(status);
  42. mainMenu.RegisterCallback<ClickEvent>(e => MainMenuClick(e));
  43. // root加载完成后,所有element算出位置后再进行计算
  44. root.RegisterCallback<GeometryChangedEvent>(e => OnMainMenuClickGeometryChanged(e));
  45. // 绑定按键点击事件
  46. playground.RegisterCallback<ClickEvent>(e => PlayGroundClick(e));
  47. shop.RegisterCallback<ClickEvent>(e => ShopClick(e));
  48. warehouse.RegisterCallback<ClickEvent>(e => WarehouseClick(e));
  49. status.RegisterCallback<ClickEvent>(e => StatusClick(e));
  50. cameraBtn.RegisterCallback<ClickEvent>(e => CameraClick(e));
  51. }
  52. private void OnDisable()
  53. {
  54. subMenus.Clear(); // 因为启动时候调用OnEable数据会被重复加载
  55. }
  56. // Update is called once per frame
  57. void Update()
  58. {
  59. CollapseMenuCheck();
  60. }
  61. Vector2 CalcPosition(Vector2 curPosition, float angle, float distance)
  62. {
  63. float radians = angle * Mathf.Deg2Rad;
  64. float x = curPosition.x + distance * Mathf.Cos(radians);
  65. float y = curPosition.y - distance * Mathf.Sin(radians);
  66. Vector2 newPosition = new Vector2(x, y);
  67. return new Vector2(x, y);
  68. }
  69. // 初始化所有按键的位置
  70. void InitialSubMenu()
  71. {
  72. foreach (var subMenu in subMenus)
  73. {
  74. subMenu.style.left = mainMenu.resolvedStyle.left;
  75. subMenu.style.top = mainMenu.resolvedStyle.top;
  76. subMenu.visible = false;
  77. }
  78. }
  79. // 点击主按键后所有子按键展开并显示
  80. void MainMenuClick(ClickEvent evt)
  81. {
  82. if (MenuData.isMenuShowed)
  83. {
  84. MenuReset();
  85. return;
  86. }
  87. // curAngle 初始角度,angleDelta 2个子菜单之间角度,distance 弹出距离,showTimer 显示时间
  88. float curAngle = 75f;
  89. float angleDelta = 40f;
  90. float distance = 70f;
  91. //float showTimer = 3.0f;
  92. foreach (var subMenu in subMenus)
  93. {
  94. subMenu.visible = true;
  95. var newPosition = CalcPosition(mainMenu.layout.position, curAngle, distance);
  96. //subMenu.layout.position.Set(newPosition.x, newPosition.y);
  97. subMenu.style.left = newPosition.x;
  98. subMenu.style.top = newPosition.y;
  99. if (subMenu.name == "home")
  100. {
  101. Debug.Log(subMenu.name + " " + newPosition.x + " " + newPosition.y);
  102. }
  103. curAngle += angleDelta;
  104. }
  105. mainMenu.transform.scale = new Vector2(0.8f, 0.8f);
  106. //Invoke("MenuReset", showTimer);
  107. //isSubMenuShow = true;
  108. MenuData.isMenuShowed = true;
  109. MenuData.menuShowTime = DateTime.Now;
  110. }
  111. // 初始化后屏幕尺寸变化时候调用。在此处应用于第一次屏幕初始化完成。
  112. void OnMainMenuClickGeometryChanged(GeometryChangedEvent evt)
  113. {
  114. //VisualElement targetElement = evt.target as VisualElement;
  115. InitialSubMenu();
  116. }
  117. void MenuReset()
  118. {
  119. //yield return new WaitForSeconds(3.0f);
  120. mainMenu.transform.scale = new Vector2(1.0f, 1.0f);
  121. MenuData.isMenuShowed = false;
  122. InitialSubMenu();
  123. }
  124. void PlayGroundClick(ClickEvent evt)
  125. {
  126. SceneManager.LoadScene("Playground", LoadSceneMode.Single);
  127. }
  128. void ShopClick(ClickEvent evt)
  129. {
  130. vamUI.SetActive(false);
  131. shoppingUI.SetActive(true);
  132. }
  133. void WarehouseClick(ClickEvent evt)
  134. {
  135. vamUI.SetActive(false);
  136. warehouseUI.SetActive(true);
  137. }
  138. void StatusClick(ClickEvent evt)
  139. {
  140. vamUI.SetActive(false);
  141. statusUI.SetActive(true);
  142. }
  143. void CameraClick(ClickEvent evt)
  144. {
  145. }
  146. // 菜单打开后收回菜单
  147. void CollapseMenuCheck()
  148. {
  149. if (MenuData.isMenuShowed)
  150. {
  151. // 计算两个时间点之间的差值
  152. TimeSpan difference = DateTime.Now - MenuData.menuShowTime;
  153. // 检查差值是否超过3秒
  154. if (difference.TotalSeconds > 3)
  155. {
  156. MenuReset();
  157. }
  158. }
  159. }
  160. }
  161. public static class MenuData
  162. {
  163. public static bool isMenuShowed = false;
  164. public static DateTime menuShowTime;
  165. }