123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- using System.Collections;
- using System.Collections.Generic;
- using Unity.VisualScripting;
- using UnityEngine;
- using UnityEngine.UI;
- using UnityEngine.UIElements;
- public class MenuController : MonoBehaviour
- {
- // Start is called once before the first execution of Update after the MonoBehaviour is created
- private VisualElement mainMenu;
- private List<VisualElement> subMenus = new();
- bool isSubMenuShow = false;
- void Start()
- {
- var root = GetComponent<UIDocument>().rootVisualElement;
- var menuArea = root.Q<VisualElement>("menuArea");
- mainMenu = menuArea.Q<VisualElement>("mainMenu");
- var home = menuArea.Q<VisualElement>("home");
- subMenus.Add(home);
- var playground = menuArea.Q<VisualElement>("playground");
- subMenus.Add(playground);
- var shop = menuArea.Q<VisualElement>("shop");
- subMenus.Add(shop);
- var warehouse = menuArea.Q<VisualElement>("warehouse");
- subMenus.Add(warehouse);
- var cameraBtn = menuArea.Q<VisualElement>("camera");
- subMenus.Add(cameraBtn);
- var status = menuArea.Q<VisualElement>("status");
- subMenus.Add(status);
- mainMenu.RegisterCallback<ClickEvent>(e => MainMenuClick(e));
- // root加载完成后,所有element算出位置后再进行计算
- root.RegisterCallback<GeometryChangedEvent>(e => OnMainMenuClickGeometryChanged(e));
- }
- // Update is called once per frame
- void Update()
- {
-
- }
- Vector2 CalcPosition (Vector2 curPosition, float angle, float distance)
- {
- float radians = angle * Mathf.Deg2Rad;
- float x = curPosition.x + distance * Mathf.Cos(radians);
- float y = curPosition.y - distance * Mathf.Sin(radians);
- Vector2 newPosition = new Vector2(x, y);
- return new Vector2(x, y);
- }
- // 初始化所有按键的位置
- void InitialSubMenu()
- {
- foreach (var subMenu in subMenus) {
- subMenu.style.left = mainMenu.resolvedStyle.left;
- subMenu.style.top = mainMenu.resolvedStyle.top;
- subMenu.visible = false;
- }
- }
- // 点击主按键后所有子按键展开并显示
- void MainMenuClick(ClickEvent evt)
- {
- if (isSubMenuShow)
- {
- MenuReset();
- isSubMenuShow = false;
- return;
- }
- // curAngle 初始角度,angleDelta 2个子菜单之间角度,distance 弹出距离,showTimer 显示时间
- float curAngle = 75f;
- float angleDelta = 40f;
- float distance = 70f;
- float showTimer = 3.0f;
- foreach (var subMenu in subMenus) {
- subMenu.visible = true;
- var newPosition = CalcPosition(mainMenu.layout.position, curAngle, distance);
- //subMenu.layout.position.Set(newPosition.x, newPosition.y);
- subMenu.style.left = newPosition.x;
- subMenu.style.top = newPosition.y;
- curAngle += angleDelta;
- }
- mainMenu.transform.scale = new Vector2(0.8f, 0.8f);
- Invoke("MenuReset", showTimer);
- isSubMenuShow = true;
- }
- // 初始化后屏幕尺寸变化时候调用。在此处应用于第一次屏幕初始化完成。
- void OnMainMenuClickGeometryChanged(GeometryChangedEvent evt) {
- //VisualElement targetElement = evt.target as VisualElement;
- InitialSubMenu();
- }
- void MenuReset()
- {
- //yield return new WaitForSeconds(3.0f);
- mainMenu.transform.scale = new Vector2(1.0f, 1.0f);
- InitialSubMenu();
- }
- }
|