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 subMenus = new(); bool isSubMenuShow = false; void Start() { var root = GetComponent().rootVisualElement; var menuArea = root.Q("menuArea"); mainMenu = menuArea.Q("mainMenu"); var home = menuArea.Q("home"); subMenus.Add(home); var playground = menuArea.Q("playground"); subMenus.Add(playground); var shop = menuArea.Q("shop"); subMenus.Add(shop); var warehouse = menuArea.Q("warehouse"); subMenus.Add(warehouse); var cameraBtn = menuArea.Q("camera"); subMenus.Add(cameraBtn); var status = menuArea.Q("status"); subMenus.Add(status); mainMenu.RegisterCallback(e => MainMenuClick(e)); // root加载完成后,所有element算出位置后再进行计算 root.RegisterCallback(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(); } }