最近有个项目需要纯键盘操作菜单,本来写个通用类,菜单等级可以无限扩展下去,试了一下没成功,只好以二级菜单先搞出来。
按数字键1点击按钮 按数字键2切换同级按钮 按数字键3返回上级按钮
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Menu : MonoBehaviour { //public getReal3DPlayerInputs getReal3dInputs; //主菜单 public Button[] mainButtons; //二级菜单面板 public GameObject[] childButtonsPanel; //二级菜单项,按组分 [HideInInspector] public ListchildButtonGroup = new List(); //当前选中主菜单索引 private int mainButtonIndex = 0; //当前选中子菜单索引 private int childButtonIndex = 0; //子菜单是否打开 private bool childPanelExpanded = false; void Start () { //主菜单事件 for(int i = 0; i < mainButtons.Length; i++) { mainButtons[i].onClick.AddListener(OnMainButtonClick); } if (mainButtons.Length > 0) { mainButtons[mainButtonIndex].Select(); } //子菜单按钮分组 for (int i = 0; i < childButtonsPanel.Length; i++) { Listbtns = new List(); for (int j = 0; j < childButtonsPanel[i].transform.childCount; j++) { Transform tr = childButtonsPanel[i].transform.GetChild(j); Button btn = tr.GetComponent(); btn.onClick.AddListener(OnChildButtonClick); btns.Add(btn); } childButtonGroup.Add(btns); } } void Update () { //点击,按下数字'1' if (UnityEngine.Input.GetKeyDown(KeyCode.Alpha1))//getReal3dInputs.WandButtonDown { if (!childPanelExpanded) { mainButtons[mainButtonIndex].onClick.Invoke(); } else { childButtonGroup[mainButtonIndex][childButtonIndex].onClick.Invoke(); } } //切换,按下数字'2' if (UnityEngine.Input.GetKeyDown(KeyCode.Alpha2))//getReal3dInputs.ChangeWandButtonDown { if(!childPanelExpanded) { mainButtonIndex++; if (mainButtonIndex > mainButtons.Length - 1) { mainButtonIndex = 0; } mainButtons[mainButtonIndex].Select(); } else { childButtonIndex++; childButtonIndex = childButtonIndex > childButtonGroup[mainButtonIndex].Count - 1 ? 0 : childButtonIndex; childButtonGroup[mainButtonIndex][childButtonIndex].Select(); } } //返回,按下数字'3' if (UnityEngine.Input.GetKeyDown(KeyCode.Alpha3))//getReal3dInputs.ResetButtonDown { CloseChildPanel(); mainButtons[mainButtonIndex].Select(); } //刷新当前选中项 if (childPanelExpanded) { childButtonGroup[mainButtonIndex][childButtonIndex].Select(); } } //主菜单点击事件函数 void OnMainButtonClick() { Debug.Log(string.Format("点击了主按钮 {0}", mainButtonIndex)); childButtonIndex = 0; DisplayChildPanel(mainButtonIndex); childButtonGroup[mainButtonIndex][childButtonIndex].Select(); } //子菜单点击事件函数 void OnChildButtonClick() { Debug.Log(string.Format("点击了子按钮 {0}", childButtonIndex)); } //显示某个子菜单面板 void DisplayChildPanel(int index) { childPanelExpanded = true; for (int i = 0; i < childButtonsPanel.Length; i++) { if(i == index) { if (!childButtonsPanel[i].activeSelf) { childButtonsPanel[i].SetActive(true); childButtonGroup[index][childButtonIndex].Select(); } } else { if (childButtonsPanel[i].activeSelf) childButtonsPanel[i].SetActive(false); } } } //显示关闭所有菜单面板 void CloseChildPanel() { childPanelExpanded = false; for (int i = 0; i < childButtonsPanel.Length; i++) { if (childButtonsPanel[i].activeSelf) childButtonsPanel[i].SetActive(false); } } }