当前位置:   article > 正文

Unity 简单UI框架_unity ui xml框架

unity ui xml框架

简介:

1,通过Resources.Load加载

2,使用字典进行缓存

3,使用重载进行动静分离,创建新画布。

4,单例模式

5,核心功能:(1)打开面板 (2)关闭面板  (3)检测配置路径  (4)检测缓存

UIManager.cs

  1. //框架使用说明
  2. //在UIConst中定义要加载预制体的名字。
  3. //在InitDicts的pathDict进行配置路径
  4. //需要配置路径和面板名称
  5. //在任何地方调用UIManager.Instance.OpenPanel("PanelName", true)即可
  6. //第一个参数是面板名称,第二个参数表示是否创建一个新的动态画布用于作为面板的根节点
  7. using System.Collections.Generic;
  8. using UnityEngine;
  9. using UnityEngine.UI;
  10. public class UIManager
  11. {
  12. private static UIManager _instance;
  13. private Transform _uiRoot;
  14. // 路径配置字典
  15. private Dictionary<string, string> pathDict;
  16. // 预制件缓存字典
  17. private Dictionary<string, GameObject> prefabDict;
  18. // 已打开界面的缓存字典
  19. public Dictionary<string, BasePanel> panelDict;
  20. public static UIManager Instance
  21. {
  22. get
  23. {
  24. if (_instance == null)
  25. {
  26. _instance = new UIManager();
  27. }
  28. return _instance;
  29. }
  30. }
  31. public Transform UIRoot
  32. {
  33. get
  34. {
  35. if (_uiRoot == null)
  36. {
  37. _uiRoot = GameObject.Find("StaticCanvas").transform;
  38. return _uiRoot;
  39. };
  40. return _uiRoot;
  41. }
  42. }
  43. private UIManager()
  44. {
  45. InitDicts();
  46. }
  47. /// <summary>
  48. /// 初始化字典。预制体字典用于缓存,面板字典用于检测面板是否打开,路径面板用于配置路径。
  49. /// </summary>
  50. private void InitDicts()
  51. {
  52. prefabDict = new Dictionary<string, GameObject>();
  53. panelDict = new Dictionary<string, BasePanel>();
  54. pathDict = new Dictionary<string, string>()
  55. {
  56. {UIConst.Start_Panel,"Start/Start_Panel" },
  57. {UIConst.Start_Panel_1,"Start/Start_Panel_1" },
  58. {UIConst.Start_Panel_2,"Start/Start_Panel_2" },
  59. {UIConst.Start_Panel_3,"Start/Start_Panel_3" },
  60. {UIConst.Start_Panel_4,"Start/Start_Panel_4" },
  61. {UIConst.Start_Panel_5,"Start/Start_Panel_5" },
  62. {UIConst.Start_Panel_6,"Start/Start_Panel_6" },
  63. {UIConst.Start_Panel_7,"Start/Start_Panel_7" },
  64. {UIConst.Start_Panel_8,"Start/Start_Panel_8" },
  65. {UIConst.Start_Panel_9,"Start/Start_Panel_9" },
  66. {UIConst.Start_Panel_10,"Start/Start_Panel_10" },
  67. {UIConst.Main_Panel,"Main_Panel" },
  68. {UIConst.Zha_Ying_Panel,"Zha_Ying_Panel" },
  69. {UIConst.Troops_Panel,"Troops_Panel" },
  70. {UIConst.Chracter_Panel,"Chracter_Panel" },
  71. {UIConst.Item_Panel,"Item_Panel" },
  72. {UIConst.JiLu_Panel,"JiLu_Panel" },
  73. {UIConst.DuDang_Panel,"Start/DuDang_Panel" }
  74. };
  75. }
  76. /// <summary>
  77. /// 打开面板。第一个参数为面板名字,第二个参数是面板是否位于动态面板,如果没有则创建一个动态面板。使用字典判断该面板是否已经打开。根据配置路径找到面板,配置路径不正确,会Debug.LogError
  78. /// </summary>
  79. /// <param name="name"></param>
  80. /// <param name="isDynamicCanvas"></param>
  81. /// <returns></returns>
  82. public BasePanel OpenPanel(string name, bool isDynamicCanvas)
  83. {
  84. BasePanel panel = null;
  85. // 检查是否已打开
  86. if (panelDict.TryGetValue(name, out panel))
  87. {
  88. Debug.LogError("界面已打开: " + name);
  89. return null;
  90. }
  91. // 检查路径是否配置
  92. string path = "";
  93. if (!pathDict.TryGetValue(name, out path))
  94. {
  95. Debug.LogError("界面名称错误,或未配置路径: " + name);
  96. return null;
  97. }
  98. // 使用缓存预制件
  99. GameObject panelPrefab = null;
  100. if (!prefabDict.TryGetValue(name, out panelPrefab))
  101. {
  102. string realPath = "Prefab/" + path;
  103. //使用Resources.Load动态加载
  104. panelPrefab = Resources.Load<GameObject>(realPath) as GameObject;
  105. if (panelPrefab.GetComponent<BasePanel>() == null)
  106. panelPrefab.AddComponent<BasePanel>();
  107. prefabDict.Add(name, panelPrefab);
  108. }
  109. GameObject panelObject;
  110. if (isDynamicCanvas == true)
  111. {
  112. Canvas canvas;
  113. GameObject DynamicCanvas = GameObject.Find("DynamicCanvas");
  114. if (DynamicCanvas == null)
  115. {
  116. //创建动态画布画布
  117. GameObject canvasGo = new GameObject("DynamicCanvas");
  118. canvas = canvasGo.AddComponent<Canvas>();
  119. canvas.renderMode = RenderMode.ScreenSpaceOverlay;
  120. canvasGo.AddComponent<CanvasScaler>();
  121. canvasGo.AddComponent<GraphicRaycaster>();
  122. panelObject = GameObject.Instantiate(panelPrefab, canvas.transform, false);
  123. }
  124. else
  125. {
  126. panelObject = GameObject.Instantiate(panelPrefab, DynamicCanvas.transform, false);
  127. }
  128. }
  129. else
  130. {
  131. panelObject = GameObject.Instantiate(panelPrefab, UIRoot, false);
  132. }
  133. // 打开界面
  134. panel = panelObject.GetComponent<BasePanel>();
  135. panelDict.Add(name, panel);
  136. panel.OpenPanel(name);
  137. return panel;
  138. }
  139. /// <summary>
  140. /// 关闭面板。参数是面板名字。查看字典该面板没有打开就return,否则关闭该面板。
  141. /// </summary>
  142. /// <param name="name"></param>
  143. /// <returns></returns>
  144. public BasePanel OpenPanel(string name)
  145. {
  146. OpenPanel(name, false);
  147. return null;
  148. }
  149. public bool ClosePanel(string name)
  150. {
  151. BasePanel panel = null;
  152. if (!panelDict.TryGetValue(name, out panel))
  153. {
  154. Debug.LogError("界面未打开: " + name);
  155. return false;
  156. }
  157. panel.ClosePanel();
  158. //panelDict.Remove(name);不移除缓存 合适的时候移除
  159. return true;
  160. }
  161. public void ShowTip(string tip)
  162. {
  163. // MenuTipPanel menuTipPanel = OpenPanel(UIConst.MenuTipPanel) as MenuTipPanel;
  164. // menuTipPanel.InitTip(Globals.TipCreateOne);
  165. }
  166. }
  167. /// <summary>
  168. /// 该结构体用于存储面板名字
  169. /// </summary>
  170. public struct UIConst
  171. {
  172. // menu panels
  173. public const string Start_Panel = "Start_Panel";
  174. public const string Start_Panel_1 = "Start_Panel_1";
  175. public const string Start_Panel_2 = "Start_Panel_2";
  176. public const string Start_Panel_3 = "Start_Panel_3";
  177. public const string Start_Panel_4 = "Start_Panel_4";
  178. public const string Start_Panel_5 = "Start_Panel_5";
  179. public const string Start_Panel_6 = "Start_Panel_6";
  180. public const string Start_Panel_7 = "Start_Panel_7";
  181. public const string Start_Panel_8 = "Start_Panel_8";
  182. public const string Start_Panel_9 = "Start_Panel_9";
  183. public const string Start_Panel_10 = "Start_Panel_10";
  184. public const string Main_Panel = "Main_Panel";
  185. public const string Zha_Ying_Panel = "Zha_Ying_Panel";
  186. public const string Troops_Panel = "Troops_Panel";
  187. public const string Chracter_Panel = "Chracter_Panel";
  188. public const string Item_Panel = "Item_Panel";
  189. public const string JiLu_Panel = "JiLu_Panel";
  190. public const string DuDang_Panel = "DuDang_Panel";
  191. }

BasePanel.cs

  1. using UnityEngine;
  2. public class BasePanel : MonoBehaviour
  3. {
  4. protected bool isRemove = false;
  5. protected new string name;
  6. public virtual void SetActive(bool active)
  7. {
  8. gameObject.SetActive(active);
  9. }
  10. //打开面板
  11. public virtual void OpenPanel(string name)
  12. {
  13. this.name = name;
  14. SetActive(true);
  15. }
  16. //按钮事件打开面板
  17. public virtual void OpenNewPanel(string name)
  18. {
  19. UIManager.Instance.OpenPanel(name);
  20. }
  21. //关闭面板
  22. public virtual void ClosePanel()
  23. {
  24. isRemove = true;
  25. SetActive(false);
  26. Destroy(gameObject);
  27. if (UIManager.Instance.panelDict.ContainsKey(name))
  28. {
  29. UIManager.Instance.panelDict.Remove(name);
  30. }
  31. }
  32. }

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

闽ICP备14008679号