当前位置:   article > 正文

Unity3d游戏开发框架-UI管理类 UIManager之美_unity3d中如何管理ui ,比如我需要按下按钮以后需要隐藏上一个ui,显示当前ui

unity3d中如何管理ui ,比如我需要按下按钮以后需要隐藏上一个ui,显示当前ui

新建一个文件夹:UIMgr
新建2个C#脚本:BaseUI.cs UIMgr.cs
里面的UIMgr.cs继承了EventNode。EventNode在前面有讲,这里重新给出一下。
IResLoadListener.cs接口,资源加载回调

  1. using UnityEngine;
  2. using System.Collections;
  3. public class BaseUI : MonoBehaviour
  4. {
  5. /// <summary>
  6. /// 当前界面名称
  7. /// </summary>
  8. [HideInInspector]
  9. public string UIName;
  10. private Transform mTransform;
  11. public Transform CacheTransform
  12. {
  13. get
  14. {
  15. if (mTransform == null) mTransform = this.transform;
  16. return mTransform;
  17. }
  18. }
  19. private GameObject mGo;
  20. public GameObject CacheGameObject
  21. {
  22. get
  23. {
  24. if (mGo == null) mGo = this.gameObject;
  25. return mGo;
  26. }
  27. }
  28. /// <summary>
  29. /// 显示当前UI
  30. /// </summary>
  31. /// <param name="param">附加参数</param>
  32. public void Show(object param = null)
  33. {
  34. CacheGameObject.SetActive(true);
  35. }
  36. /// <summary>
  37. /// 隐藏当前界面
  38. /// </summary>
  39. public void Hide()
  40. {
  41. CacheGameObject.SetActive(false);
  42. }
  43. /// <summary>
  44. /// 绑定脚本并且激活游戏物体会调用的方法
  45. /// </summary>
  46. void Awake()
  47. {
  48. OnAwake();
  49. }
  50. /// <summary>
  51. /// 初始化UI主要用于寻找组件等
  52. /// </summary>
  53. public void UIInit()
  54. {
  55. OnInit();
  56. }
  57. /// <summary>
  58. /// 显示当前界面
  59. /// </summary>
  60. /// <param name="param">附加参数</param>
  61. protected virtual void OnShow(object param){ }
  62. /// <summary>
  63. /// 隐藏当前界面
  64. /// </summary>
  65. protected virtual void OnHide() { }
  66. /// <summary>
  67. /// 初始化当前界面
  68. /// </summary>
  69. protected virtual void OnInit() { }
  70. protected virtual void OnAwake() { }
  71. /// <summary>
  72. /// 删除当前UI
  73. /// </summary>
  74. protected virtual void OnDestroy() { }
  75. }
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class EventNode : MonoBehaviour
  5. {
  6. /// <summary>
  7. /// 节点优先级
  8. /// </summary>
  9. public int EventNodePriority { set; get; }
  10. /// <summary>
  11. /// 所有消息集合
  12. /// </summary>
  13. private Dictionary<int, List<IEventListener>> mListeners = new Dictionary<int, List<IEventListener>>();
  14. /// <summary>
  15. /// 消息节点
  16. /// </summary>
  17. private List<EventNode> mNodeList = new List<EventNode>();
  18. /// <summary>
  19. /// 挂载一个消息节点到当前节点上
  20. /// </summary>
  21. /// <param name="node">消息节点</param>
  22. /// <returns>如果当前节点里面已经包含要添加的这个节点那么返回false</returns>
  23. public bool AttachEventNode(EventNode node)
  24. {
  25. if (node == null)
  26. {
  27. return false;
  28. }
  29. if (mNodeList.Contains(node))
  30. {
  31. return false;
  32. }
  33. int pos = 0;
  34. for (int i = 0; i < mNodeList.Count;i++ )
  35. {
  36. if (node.EventNodePriority > mNodeList[i].EventNodePriority)
  37. {
  38. break;
  39. }
  40. pos++;
  41. }
  42. mNodeList.Insert(pos,node);
  43. return true;
  44. }
  45. /// <summary>
  46. /// 卸载一个消息节点
  47. /// </summary>
  48. /// <param name="node">消息节点</param>
  49. /// <returns>如果节点不存在那么返回false</returns>
  50. public bool DetachEventNode(EventNode node)
  51. {
  52. if (!mNodeList.Contains(node))
  53. {
  54. return false;
  55. }
  56. mNodeList.Remove(node);
  57. return true;
  58. }
  59. /// <summary>
  60. /// 挂载一个消息监听器到当前的消息节点
  61. /// </summary>
  62. /// <param name="key">消息ID</param>
  63. /// <param name="listener">消息监听器</param>
  64. /// <returns>当前消息节点已经挂载了这个消息监听器那么返回false</returns>
  65. public bool AttachEventListener(int key,IEventListener listener)
  66. {
  67. if (listener == null)
  68. {
  69. return false;
  70. }
  71. if (!mListeners.ContainsKey(key))
  72. {
  73. mListeners.Add(key,new List<IEventListener>() { listener });
  74. return true;
  75. }
  76. if (mListeners[key].Contains(listener))
  77. {
  78. return false;
  79. }
  80. int pos = 0;
  81. for (int i = 0;i< mListeners[key].Count;i++ )
  82. {
  83. if (listener.EventPriority() > mListeners[key][i].EventPriority())
  84. {
  85. break;
  86. }
  87. pos++;
  88. }
  89. mListeners[key].Insert(pos,listener);
  90. return true;
  91. }
  92. /// <summary>
  93. /// 卸载一个消息节点
  94. /// </summary>
  95. /// <returns>如果当前消息节点不存在那么返回false</returns>
  96. public bool DetachEventListener(int key,IEventListener listener)
  97. {
  98. if (mListeners.ContainsKey(key) && mListeners[key].Contains(listener))
  99. {
  100. mListeners[key].Remove(listener);
  101. return true;
  102. }
  103. return false;
  104. }
  105. public void SendEvent(int key,object param1 = null,object param2 = null)
  106. {
  107. DispatchEvent(key, param1, param2);
  108. }
  109. /// <summary>
  110. /// 派发消息到子消息节点以及自己节点下的监听器上
  111. /// </summary>
  112. /// <param name="key">消息ID</param>
  113. /// <param name="param1"></param>
  114. /// <param name="param2"></param>
  115. /// <returns>如果中断消息返回true</returns>
  116. private bool DispatchEvent(int key,object param1,object param2)
  117. {
  118. for (int i = 0; i < mNodeList.Count;i++ )
  119. {
  120. if (mNodeList[i].DispatchEvent(key, param1, param2)) return true;
  121. }
  122. return TriggerEvent(key, param1, param2);
  123. }
  124. /// <summary>
  125. /// 消息触发
  126. /// </summary>
  127. /// <param name="key">消息id</param>
  128. /// <param name="param1"></param>
  129. /// <param name="param2"></param>
  130. /// <returns>是否中断</returns>
  131. private bool TriggerEvent(int key,object param1,object param2)
  132. {
  133. if (!this.gameObject.activeSelf || !this.gameObject.activeInHierarchy || !this.enabled)
  134. {
  135. return false;
  136. }
  137. if (!mListeners.ContainsKey(key))
  138. {
  139. return false;
  140. }
  141. List<IEventListener> listeners = mListeners[key];
  142. for (int i = 0; i < listeners.Count; i++)
  143. {
  144. if (listeners[i].HandleEvent(key, param1, param2)) return true;
  145. }
  146. return false;
  147. }
  148. void OnApplicationQuit()
  149. {
  150. mListeners.Clear();
  151. mNodeList.Clear();
  152. }
  153. }

新建一个类UIMgr .cs继承EventNode

  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using System.Collections.Generic;
  5. public class UIMgr : EventNode
  6. {
  7. private static UIMgr mInstance;
  8. public static UIMgr Instance
  9. {
  10. get
  11. {
  12. return mInstance;
  13. }
  14. }
  15. /// <summary>
  16. /// 所有UI
  17. /// </summary>
  18. private Dictionary<string, BaseUI> mDicUI = new Dictionary<string, BaseUI>();
  19. /// <summary>
  20. /// 添加一个UI
  21. /// </summary>
  22. /// <param name="ui"></param>
  23. public void AddUI(BaseUI ui)
  24. {
  25. if (ui != null)
  26. {
  27. mDicUI[ui.UIName] = ui;
  28. }
  29. }
  30. /// <summary>
  31. /// 移除一个UI
  32. /// </summary>
  33. /// <param name="ui"></param>
  34. public void RemoveUI(BaseUI ui)
  35. {
  36. if (ui != null && mDicUI.ContainsKey(ui.UIName))
  37. {
  38. mDicUI.Remove(ui.UIName);
  39. }
  40. }
  41. /// <summary>
  42. /// 所有命令集合
  43. /// </summary>
  44. public List<Command> cmdList = new List<Command>();
  45. internal Transform UIROOT = null;
  46. void Awake()
  47. {
  48. UIROOT = this.transform.FindChild("UIRoot");
  49. mInstance = this;
  50. DontDestroyOnLoad(this.gameObject);
  51. }
  52. #region 创建UI
  53. /// <summary>
  54. /// 创建UI
  55. /// </summary>
  56. /// <param name="uiName">UI名称</param>
  57. /// <param name="type">要绑定的脚本</param>
  58. /// <param name="listener">创建完成的回调</param>
  59. public void CreateUI(string uiName, Type type, ILoadUIListener listener)
  60. {
  61. cmdList.Add(Command.CreateCmd(type,uiName,listener));
  62. }
  63. /// <summary>
  64. /// 创建UI的实体部分
  65. /// </summary>
  66. /// <param name="cmd">命令</param>
  67. private void _Create(Command cmd)
  68. {
  69. BaseUI ui= null;
  70. mDicUI.TryGetValue(cmd.uiName, out ui);
  71. if (ui != null)
  72. {
  73. if (cmd.listener != null) cmd.listener.FiniSh(ui);
  74. }
  75. else
  76. {
  77. ResMgr.Instance.Load(cmd.uiName,new LoadResFinish(cmd));
  78. }
  79. }
  80. #endregion
  81. #region 显示UI
  82. /// <summary>
  83. /// 显示一个UI界面 如果不存在就创建
  84. /// </summary>
  85. /// <param name="uiName">ui名称</param>
  86. /// <param name="type">要绑定的脚本</param>
  87. /// <param name="listener">如果界面不存在则会有界面加载完成后的回调</param>
  88. /// <param name="param">要传入的参数</param>
  89. public void ShowUI(string uiName, Type type, ILoadUIListener listener,object param = null,bool createCanCall = false)
  90. {
  91. BaseUI ui = null;
  92. mDicUI.TryGetValue(uiName,out ui);
  93. if (ui == null)
  94. {
  95. cmdList.Add(Command.CreateAndShowCmd(uiName,type,listener, param, createCanCall));
  96. }
  97. else
  98. {
  99. cmdList.Add(Command.ShowCmd(uiName, listener, param, createCanCall));
  100. }
  101. }
  102. /// <summary>
  103. /// 显示一个界面
  104. /// </summary>
  105. /// <param name="cmd"></param>
  106. private void _ShowUI(Command cmd)
  107. {
  108. BaseUI ui = null;
  109. mDicUI.TryGetValue(cmd.uiName, out ui);
  110. if (ui != null)
  111. {
  112. if (cmd.listener != null)
  113. {
  114. cmd.listener.FiniSh(ui);
  115. }
  116. ui.Show();
  117. }
  118. }
  119. #endregion
  120. #region 隐藏UI
  121. /// <summary>
  122. /// 隐藏这个UI
  123. /// </summary>
  124. /// <param name="uiName"></param>
  125. public void HideUI(string uiName)
  126. {
  127. cmdList.Add(Command.HideCmd(uiName));
  128. }
  129. private void _HideUI(Command cmd)
  130. {
  131. Debug.Log("_HideUI " + cmd.uiName);
  132. BaseUI ui = null;
  133. mDicUI.TryGetValue(cmd.uiName, out ui);
  134. if (ui != null)
  135. {
  136. ui.Hide();
  137. }
  138. }
  139. #endregion
  140. #region 删除UI
  141. /// <summary>
  142. /// 删除UI
  143. /// </summary>
  144. /// <param name="uiName">UI名称</param>
  145. public void DestroyUI(string uiName)
  146. {
  147. cmdList.Add(Command.DestroyCmd(uiName));
  148. }
  149. private void _DestroyUI(Command cmd)
  150. {
  151. BaseUI ui = null;
  152. mDicUI.TryGetValue(cmd.uiName, out ui);
  153. if (ui != null)
  154. {
  155. mDicUI.Remove(ui.UIName);
  156. Destroy(ui.CacheGameObject);
  157. }
  158. }
  159. #endregion
  160. // Update is called every frame, if the MonoBehaviour is enabled.
  161. void Update()
  162. {
  163. if (cmdList.Count > 0)
  164. {
  165. Command tempCmd = null;
  166. tempCmd = cmdList[0];
  167. if (tempCmd == null)
  168. {
  169. cmdList.RemoveAt(0);
  170. }
  171. else
  172. {
  173. switch(tempCmd.cmdType)
  174. {
  175. case Command.CmdType.CreateAndShow:
  176. _Create(tempCmd);
  177. break;
  178. case Command.CmdType.Create:
  179. _Create(tempCmd);
  180. break;
  181. case Command.CmdType.Destroy:
  182. _DestroyUI(tempCmd);
  183. break;
  184. case Command.CmdType.Hide:
  185. _HideUI(tempCmd);
  186. break;
  187. case Command.CmdType.Show:
  188. _ShowUI(tempCmd);
  189. break;
  190. }
  191. cmdList.RemoveAt(0);
  192. }
  193. }
  194. }
  195. /// <summary>
  196. /// UI资源加载完成的回调
  197. /// </summary>
  198. public class LoadResFinish : IResLoadListener
  199. {
  200. /// <summary>
  201. /// 命令
  202. /// </summary>
  203. public Command cmd;
  204. public LoadResFinish(Command _cmd)
  205. {
  206. cmd = _cmd;
  207. }
  208. public void Finish(object asset)
  209. {
  210. if (cmd == null)
  211. {
  212. return;
  213. }
  214. GameObject go = Instantiate<GameObject>(asset as GameObject);
  215. go.SetActive(false);
  216. BaseUI ui = go.AddComponent(cmd.type) as BaseUI;
  217. ui.UIInit();
  218. ui.UIName = cmd.uiName;
  219. go.gameObject.name = ui.UIName;
  220. ui.CacheTransform.SetParent(UIMgr.Instance.UIROOT, false);
  221. UIMgr.Instance.AddUI(ui);
  222. if (cmd.cmdType == Command.CmdType.CreateAndShow)
  223. {
  224. UIMgr.Instance.ShowUI(cmd.uiName, cmd.type, cmd.listener);
  225. }
  226. else if (cmd.createCanCall && cmd.listener != null)
  227. {
  228. cmd.listener.FiniSh(ui);
  229. }
  230. }
  231. public void Failure()
  232. {
  233. if (cmd.createCanCall && cmd.listener != null)
  234. {
  235. cmd.listener.Failure();
  236. }
  237. }
  238. }
  239. /// <summary>
  240. /// 界面加载回调
  241. /// </summary>
  242. public interface ILoadUIListener
  243. {
  244. void FiniSh(BaseUI ui);
  245. void Failure();
  246. }
  247. /// <summary>
  248. /// 操作UI命令集
  249. /// </summary>
  250. public class Command
  251. {
  252. /// <summary>
  253. /// 命令类型
  254. /// </summary>
  255. public enum CmdType
  256. {
  257. /// <summary>
  258. /// 创建
  259. /// </summary>
  260. CreateAndShow,
  261. /// <summary>
  262. /// 创建
  263. /// </summary>
  264. Create,
  265. /// <summary>
  266. /// 显示或者刷新
  267. /// </summary>
  268. Show,
  269. /// <summary>
  270. /// 隐藏
  271. /// </summary>
  272. Hide,
  273. /// <summary>
  274. /// 删除
  275. /// </summary>
  276. Destroy,
  277. }
  278. /// <summary>
  279. /// UI名称
  280. /// </summary>
  281. public string uiName;
  282. /// <summary>
  283. /// 要绑定的脚本
  284. /// </summary>
  285. public Type type;
  286. /// <summary>
  287. /// 加载完成之后的回调
  288. /// </summary>
  289. public ILoadUIListener listener;
  290. /// <summary>
  291. /// 要传入的数据
  292. /// </summary>
  293. public object param;
  294. /// <summary>
  295. /// 命令类型
  296. /// </summary>
  297. public CmdType cmdType;
  298. /// <summary>
  299. /// 创建时候需要回调
  300. /// </summary>
  301. public bool createCanCall = true;
  302. /// <summary>
  303. /// 获取一个显示的命令
  304. /// </summary>
  305. /// <param name="_uiName">UI名称</param>
  306. /// <param name="_param">要传入的参数</param>
  307. public static Command CreateAndShowCmd(string uiName, Type type, ILoadUIListener listener, object param , bool createCanCall)
  308. {
  309. Command cmd = new Command(CmdType.CreateAndShow, uiName, type);
  310. cmd.createCanCall = createCanCall;
  311. cmd.listener = listener;
  312. cmd.type = type;
  313. cmd.param = param;
  314. return cmd;
  315. }
  316. /// <summary>
  317. /// 获取一个显示的命令
  318. /// </summary>
  319. /// <param name="_uiName">UI名称</param>
  320. /// <param name="_param">要传入的参数</param>
  321. public static Command ShowCmd(string _uiName,ILoadUIListener listener ,object _param, bool _createCanCall)
  322. {
  323. Command cmd = new Command(CmdType.Show, _uiName, _param);
  324. cmd.createCanCall = _createCanCall;
  325. cmd.listener = listener;
  326. return cmd;
  327. }
  328. /// <summary>
  329. /// 获取一个创建的命令
  330. /// </summary>
  331. /// <param name="_type">要绑定的脚本</param>
  332. /// <param name="_listener">加载完成之后的回调</param>
  333. public static Command CreateCmd(Type _type,string _uiName, ILoadUIListener _listener)
  334. {
  335. return new Command(CmdType.Create, _uiName, _type, _listener);
  336. }
  337. /// <summary>
  338. /// 获取一个隐藏命令
  339. /// </summary>
  340. /// <param name="_uiName">要隐藏的UI名称</param>
  341. /// <returns></returns>
  342. public static Command HideCmd(string _uiName)
  343. {
  344. return new Command(CmdType.Hide, _uiName,null);
  345. }
  346. /// <summary>
  347. /// 获取一个删除的命令
  348. /// </summary>
  349. /// <param name="_uiName">UI名称</param>
  350. /// <returns></returns>
  351. public static Command DestroyCmd(string _uiName)
  352. {
  353. return new Command(CmdType.Destroy, _uiName, null);
  354. }
  355. /// <summary>
  356. /// 构造函数
  357. /// </summary>
  358. /// <param name="_cmdType">命令类型</param>
  359. /// <param name="_uiName">UI名称</param>
  360. /// <param name="_param">要传入的参数</param>
  361. public Command(CmdType _cmdType, string _uiName, object _param)
  362. {
  363. uiName = _uiName;
  364. cmdType = _cmdType;
  365. param = _param;
  366. }
  367. /// <summary>
  368. /// 构造
  369. /// </summary>
  370. /// <param name="_cmdType">命令类型</param>
  371. /// <param name="_type">要绑定的脚本</param>
  372. /// <param name="_listener">加载完成之后的回调</param>
  373. public Command(CmdType _cmdType,string _uiName,Type _type,ILoadUIListener _listener)
  374. {
  375. cmdType = _cmdType;
  376. type = _type;
  377. listener = _listener;
  378. uiName = _uiName;
  379. }
  380. }
  381. }

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号