6using System.Collections.Generic;
7using System.Reflection;
11 [AddComponentMenu(
"UI/Extensions/Menu Manager")]
12 [DisallowMultipleComponent]
16 private Menu[] menuScreens;
20 get {
return menuScreens; }
21 set { menuScreens = value; }
25 private int startScreen = 0;
29 get {
return startScreen; }
30 set { startScreen = value; }
33 private Stack<Menu> menuStack =
new Stack<Menu>();
47 Debug.LogError(
"Not enough Menu Screens configured");
51 private void OnDestroy()
58 var prefab = GetPrefab(MenuName);
60 return Instantiate(prefab, transform);
65 var prefab = GetPrefab(MenuName);
67 menuInstance = Instantiate(prefab, transform);
73 if (menuStack.Count > 0)
77 foreach (var menu
in menuStack)
79 menu.gameObject.SetActive(
false);
81 if (menu.DisableMenusUnderneath)
86 var topCanvas = menuInstance.GetComponent<Canvas>();
87 var previousCanvas = menuStack.Peek().GetComponent<Canvas>();
88 topCanvas.sortingOrder = previousCanvas.sortingOrder + 1;
91 menuStack.Push(menuInstance);
94 private GameObject GetPrefab(
string PrefabName)
103 throw new MissingReferenceException(
"Prefab not found for " + PrefabName);
108 if (menuStack.Count == 0)
110 Debug.LogErrorFormat(menu,
"{0} cannot be closed because menu stack is empty", menu.GetType());
114 if (menuStack.Peek() != menu)
116 Debug.LogErrorFormat(menu,
"{0} cannot be closed because it is not on top of stack", menu.GetType());
125 var menuInstance = menuStack.Pop();
127 if (menuInstance.DestroyWhenClosed)
128 Destroy(menuInstance.gameObject);
130 menuInstance.gameObject.SetActive(
false);
134 foreach (var menu
in menuStack)
136 menu.gameObject.SetActive(
true);
138 if (menu.DisableMenusUnderneath)
143 private void Update()
146 if (Input.GetKeyDown(KeyCode.Escape) && menuStack.Count > 0)
148 menuStack.Peek().OnBackPressed();
153 public static class MenuExtensions
155 public static Menu GetMenu(
this GameObject go)
157 return go.GetComponent<Menu>();
Credit Erdener Gonenc - @PixelEnvision.