123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using Unity.VisualScripting;
- using UnityEngine;
- using UnityEngine.SceneManagement;
- 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();
- //private bool isSubMenuShow = false;
- private GameObject uiPlaceholder; // Manu会控制其他子菜单显示和隐藏,因此所有子菜单都必须挂载在UI Placeholder下
- private GameObject vamUI; // vamUI = Voice and Manu UI;
- private GameObject shoppingUI, statusUI, warehouseUI; // 对应点击菜单后展开的几个子菜单
- void OnEnable()
- {
- Debug.Log("manu controller start");
- uiPlaceholder = GameObject.Find("UI Placeholder");
- vamUI = uiPlaceholder.transform.Find("VoiceAndMenu").gameObject;
- shoppingUI = uiPlaceholder.transform.Find("ShoppingUI").gameObject;
- statusUI = uiPlaceholder.transform.Find("Status").gameObject;
- warehouseUI = uiPlaceholder.transform.Find("Warehouse").gameObject;
- 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));
- // 绑定按键点击事件
- playground.RegisterCallback<ClickEvent>(e => PlayGroundClick(e));
- shop.RegisterCallback<ClickEvent>(e => ShopClick(e));
- warehouse.RegisterCallback<ClickEvent>(e => WarehouseClick(e));
- status.RegisterCallback<ClickEvent>(e => StatusClick(e));
- cameraBtn.RegisterCallback<ClickEvent>(e => CameraClick(e));
- }
- private void OnDisable()
- {
- subMenus.Clear(); // 因为启动时候调用OnEable数据会被重复加载
- }
- // Update is called once per frame
- void Update()
- {
- CollapseMenuCheck();
- }
- 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 (MenuData.isMenuShowed)
- {
- MenuReset();
- 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;
- if (subMenu.name == "home")
- {
- Debug.Log(subMenu.name + " " + newPosition.x + " " + newPosition.y);
- }
- curAngle += angleDelta;
- }
- mainMenu.transform.scale = new Vector2(0.8f, 0.8f);
- //Invoke("MenuReset", showTimer);
- //isSubMenuShow = true;
- MenuData.isMenuShowed = true;
- MenuData.menuShowTime = DateTime.Now;
- }
- // 初始化后屏幕尺寸变化时候调用。在此处应用于第一次屏幕初始化完成。
- 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);
- MenuData.isMenuShowed = false;
- InitialSubMenu();
- }
- void PlayGroundClick(ClickEvent evt)
- {
- SceneManager.LoadScene("Playground", LoadSceneMode.Single);
- }
- void ShopClick(ClickEvent evt)
- {
- vamUI.SetActive(false);
- shoppingUI.SetActive(true);
- }
- void WarehouseClick(ClickEvent evt)
- {
- vamUI.SetActive(false);
- warehouseUI.SetActive(true);
- }
- void StatusClick(ClickEvent evt)
- {
- vamUI.SetActive(false);
- statusUI.SetActive(true);
- }
- void CameraClick(ClickEvent evt)
- {
- }
- // 菜单打开后收回菜单
- void CollapseMenuCheck()
- {
- if (MenuData.isMenuShowed)
- {
- // 计算两个时间点之间的差值
- TimeSpan difference = DateTime.Now - MenuData.menuShowTime;
- // 检查差值是否超过3秒
- if (difference.TotalSeconds > 3)
- {
- MenuReset();
- }
- }
- }
- }
- public static class MenuData
- {
- public static bool isMenuShowed = false;
- public static DateTime menuShowTime;
- }
|