MenuController.cs 3.8 KB

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