MenuController.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Unity.VisualScripting;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. using UnityEngine.UIElements;
  7. public class MenuController : MonoBehaviour
  8. {
  9. // Start is called once before the first execution of Update after the MonoBehaviour is created
  10. private VisualElement mainMenu;
  11. private List<VisualElement> subMenus = new();
  12. bool isSubMenuShow = false;
  13. void Start()
  14. {
  15. var root = GetComponent<UIDocument>().rootVisualElement;
  16. var menuArea = root.Q<VisualElement>("menuArea");
  17. mainMenu = menuArea.Q<VisualElement>("mainMenu");
  18. var home = menuArea.Q<VisualElement>("home");
  19. subMenus.Add(home);
  20. var playground = menuArea.Q<VisualElement>("playground");
  21. subMenus.Add(playground);
  22. var shop = menuArea.Q<VisualElement>("shop");
  23. subMenus.Add(shop);
  24. var warehouse = menuArea.Q<VisualElement>("warehouse");
  25. subMenus.Add(warehouse);
  26. var cameraBtn = menuArea.Q<VisualElement>("camera");
  27. subMenus.Add(cameraBtn);
  28. var status = menuArea.Q<VisualElement>("status");
  29. subMenus.Add(status);
  30. mainMenu.RegisterCallback<ClickEvent>(e => MainMenuClick(e));
  31. // root加载完成后,所有element算出位置后再进行计算
  32. root.RegisterCallback<GeometryChangedEvent>(e => OnMainMenuClickGeometryChanged(e));
  33. }
  34. // Update is called once per frame
  35. void Update()
  36. {
  37. }
  38. Vector2 CalcPosition (Vector2 curPosition, float angle, float distance)
  39. {
  40. float radians = angle * Mathf.Deg2Rad;
  41. float x = curPosition.x + distance * Mathf.Cos(radians);
  42. float y = curPosition.y - distance * Mathf.Sin(radians);
  43. Vector2 newPosition = new Vector2(x, y);
  44. return new Vector2(x, y);
  45. }
  46. // 初始化所有按键的位置
  47. void InitialSubMenu()
  48. {
  49. foreach (var subMenu in subMenus) {
  50. subMenu.style.left = mainMenu.resolvedStyle.left;
  51. subMenu.style.top = mainMenu.resolvedStyle.top;
  52. subMenu.visible = false;
  53. }
  54. }
  55. // 点击主按键后所有子按键展开并显示
  56. void MainMenuClick(ClickEvent evt)
  57. {
  58. if (isSubMenuShow)
  59. {
  60. MenuReset();
  61. isSubMenuShow = false;
  62. return;
  63. }
  64. // curAngle 初始角度,angleDelta 2个子菜单之间角度,distance 弹出距离,showTimer 显示时间
  65. float curAngle = 75f;
  66. float angleDelta = 40f;
  67. float distance = 70f;
  68. float showTimer = 3.0f;
  69. foreach (var subMenu in subMenus) {
  70. subMenu.visible = true;
  71. var newPosition = CalcPosition(mainMenu.layout.position, curAngle, distance);
  72. //subMenu.layout.position.Set(newPosition.x, newPosition.y);
  73. subMenu.style.left = newPosition.x;
  74. subMenu.style.top = newPosition.y;
  75. curAngle += angleDelta;
  76. }
  77. mainMenu.transform.scale = new Vector2(0.8f, 0.8f);
  78. Invoke("MenuReset", showTimer);
  79. isSubMenuShow = true;
  80. }
  81. // 初始化后屏幕尺寸变化时候调用。在此处应用于第一次屏幕初始化完成。
  82. void OnMainMenuClickGeometryChanged(GeometryChangedEvent evt) {
  83. //VisualElement targetElement = evt.target as VisualElement;
  84. InitialSubMenu();
  85. }
  86. void MenuReset()
  87. {
  88. //yield return new WaitForSeconds(3.0f);
  89. mainMenu.transform.scale = new Vector2(1.0f, 1.0f);
  90. InitialSubMenu();
  91. }
  92. }