当前位置:   article > 正文

Unity框架学习--UI管理器

ui管理器

UIManager

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6. public class UIManager : SingletonMonoAutoBase1_DonDestoryOnLoad<UIManager>
  7. {
  8. private Transform rearmost;
  9. public Transform Rearmost
  10. {
  11. get
  12. {
  13. if (rearmost == null)
  14. rearmost = transform.Find("RearMost");
  15. return rearmost;
  16. }
  17. }
  18. private Transform rear;
  19. public Transform Rear
  20. {
  21. get
  22. {
  23. if (rear == null)
  24. rear = transform.Find("Rear");
  25. return rear;
  26. }
  27. }
  28. private Transform middle;
  29. public Transform Middle
  30. {
  31. get
  32. {
  33. if (middle == null)
  34. middle = transform.Find("Middle");
  35. return middle;
  36. }
  37. }
  38. private Transform front;
  39. public Transform Front
  40. {
  41. get
  42. {
  43. if (front == null)
  44. front = transform.Find("Front");
  45. return front;
  46. }
  47. }
  48. private Transform foreFront;
  49. public Transform ForeFront
  50. {
  51. get
  52. {
  53. if (foreFront == null)
  54. foreFront = transform.Find("ForeFront");
  55. return foreFront;
  56. }
  57. }
  58. //记录当前已经显示的面板
  59. Dictionary<GameObject, GameObject> panelDistionary = new Dictionary<GameObject, GameObject>();
  60. /// <summary>
  61. /// 显示面板
  62. /// </summary>
  63. public void ShowPanel(GameObject panelPrefab,E_PanelDisplayLayer layer=E_PanelDisplayLayer.Middle)
  64. {
  65. if (panelPrefab==null)
  66. {
  67. Debug.LogWarning("显示失败,要显示的面板的预制体为null");
  68. return;
  69. }
  70. //如果当前已经显示了该面板,则不重复显示了,而是直接返回
  71. if (panelDistionary.ContainsKey(panelPrefab))
  72. return;
  73. GameObject panel = Instantiate(panelPrefab); //创建指定的面板物体
  74. panel.name = panelPrefab.name; //给物体改名
  75. panelDistionary.Add(panelPrefab, panel); //将该面板的信息记录到字典中
  76. Transform parent = null; //记录该面板要放进哪个层中来显示
  77. switch (layer)
  78. {
  79. case E_PanelDisplayLayer.Rearmost:
  80. parent = Rearmost;
  81. break;
  82. case E_PanelDisplayLayer.Rear:
  83. parent = Rear;
  84. break;
  85. case E_PanelDisplayLayer.Middle:
  86. parent = Middle;
  87. break;
  88. case E_PanelDisplayLayer.Front:
  89. parent = Front;
  90. break;
  91. case E_PanelDisplayLayer.ForeFront:
  92. parent = ForeFront;
  93. break;
  94. default:
  95. break;
  96. }
  97. panel.transform.SetParent(transform, false); //修正面板的位置
  98. panel.transform.SetParent(parent); //在指定层显示该面板
  99. }
  100. public void HidePanel(GameObject panelPrefab)
  101. {
  102. if (panelPrefab == null)
  103. {
  104. Debug.LogWarning("显示失败,要隐藏的面板的预制体为null");
  105. return;
  106. }
  107. //要隐藏的面板不存在
  108. if (!panelDistionary.ContainsKey(panelPrefab)) return;
  109. Destroy(panelDistionary[panelPrefab]); //销毁面板
  110. panelDistionary.Remove(panelPrefab); //移除字典中该面板的信息
  111. }
  112. /// <summary>
  113. /// 隐藏面板--重置方法
  114. /// </summary>
  115. public void HidePanel(string panelPrefabName)
  116. {
  117. foreach (var item in panelDistionary.Keys)
  118. {
  119. if (item.name == panelPrefabName)
  120. {
  121. HidePanel(item);
  122. return;
  123. }
  124. }
  125. return;
  126. }
  127. /// <summary>
  128. /// 判断指定的面板是否显示了
  129. /// </summary>
  130. public bool IsPanelShowed(GameObject panelPrefab)
  131. {
  132. return panelDistionary.ContainsKey(panelPrefab);
  133. }
  134. /// <summary>
  135. /// 判断指定的面板是否显示了
  136. /// </summary>
  137. public bool IsPanelShowed(string panelPrefabName)
  138. {
  139. foreach (var item in panelDistionary.Keys)
  140. {
  141. if (item.name == panelPrefabName)
  142. {
  143. return true;
  144. }
  145. }
  146. return false;
  147. }
  148. private void Awake()
  149. {
  150. //创建画布
  151. CreateOverlayCanvas();
  152. //创建EventSystem
  153. CreateEventSystem();
  154. }
  155. /// <summary>
  156. /// 创建画布
  157. /// </summary>
  158. void CreateOverlayCanvas()
  159. {
  160. //改layer
  161. gameObject.layer = LayerMask.NameToLayer("UI");
  162. //添加并设置Canvas组件
  163. Canvas canvas = gameObject.AddComponent<Canvas>();
  164. canvas.renderMode = RenderMode.ScreenSpaceOverlay;
  165. canvas.sortingOrder = 1000;
  166. //添加并设置CanvasScaler组件
  167. CanvasScaler canvasScaler = gameObject.AddComponent<CanvasScaler>();
  168. canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
  169. canvasScaler.referenceResolution = new Vector2(Screen.width, Screen.height);
  170. canvasScaler.matchWidthOrHeight = Screen.width > Screen.height ? 1 : 0;
  171. //添加并设置Graphic Raycaster 组件
  172. GraphicRaycaster graphicRaycaster = gameObject.AddComponent<GraphicRaycaster>();
  173. //添加子物体,作为显示的层的父物体
  174. //Rearmost 层的父物体
  175. GameObject rearmost = new GameObject("RearMost");
  176. rearmost.transform.SetParent(transform,false);
  177. //Rear 层的父物体
  178. GameObject rear = new GameObject("Rear");
  179. rear.transform.SetParent(transform, false);
  180. //Middle 层的父物体
  181. GameObject middle = new GameObject("Middle");
  182. middle.transform.SetParent(transform, false);
  183. //Front 层的父物体
  184. GameObject front = new GameObject("Front");
  185. front.transform.SetParent(transform, false);
  186. //Frontmost 层的父物体
  187. GameObject foreFront = new GameObject("ForeFront");
  188. foreFront.transform.SetParent(transform, false);
  189. }
  190. /// <summary>
  191. /// 创建EventSystem
  192. /// </summary>
  193. void CreateEventSystem()
  194. {
  195. //如果场景中已经存在该物体则不创建直接返回
  196. if (FindObjectOfType<EventSystem>()) return;
  197. GameObject eventSystem = new GameObject("EventSystem");
  198. DontDestroyOnLoad(eventSystem);
  199. eventSystem.AddComponent<EventSystem>();
  200. eventSystem.AddComponent<StandaloneInputModule>();
  201. }
  202. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/761534
推荐阅读
相关标签
  

闽ICP备14008679号

        
cppcmd=keepalive&