UI(UGUI)框架-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类
Posted 千喜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UI(UGUI)框架-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类相关的知识,希望对你有一定的参考价值。
UIManage单实例:
1 /// 单例模式的核心 2 /// 1,定义一个静态的对象 在外界访问 在内部构造 3 /// 2,构造方法私有化 4 5 private static UIManager _instance; 6 7 public static UIManager Instance 8 { 9 get 10 { 11 if (_instance == null) 12 { 13 _instance = new UIManager(); 14 } 15 return _instance; 16 } 17 } 18 //构造方法私有化 19 private UIManager() 20 { 21 //解析json文件 22 ParseUIPanelTypeJson(); 23 }
创建GameRoot脚本:启动UI(作为启动面板的入口)
1 using UnityEngine; 2 using System.Collections; 3 4 public class GameRoot : MonoBehaviour { 5 6 // Use this for initialization 7 void Start () { 8 UIManager.Instance.PushPanel(UIPanelType.MainMenu); 9 } 10 11 12 }
BasePanel面板基类(面板共有的基类,将面板相同的属性与行为抽象出来):
1 using UnityEngine; 2 using System.Collections; 3 4 public class BasePanel : MonoBehaviour { 5 /// <summary> 6 /// 界面被显示出来 7 /// </summary> 8 public virtual void OnEnter() 9 { 10 11 } 12 13 /// <summary> 14 /// 界面暂停 15 /// </summary> 16 public virtual void OnPause() 17 { 18 19 } 20 21 /// <summary> 22 /// 界面继续 23 /// </summary> 24 public virtual void OnResume() 25 { 26 27 } 28 29 /// <summary> 30 /// 界面不显示,退出这个界面,界面被关系 31 /// </summary> 32 public virtual void OnExit() 33 { 34 35 } 36 }
每一个项目里面的面板不一样,也就自己要去创建面板类(继承于BasePanel面板基类):
要在UIManage管理所有的面板:
1 /// <summary> 2 /// 根据面板类型 得到实例化的面板 3 /// </summary> 4 /// <returns></returns> 5 private BasePanel GetPanel(UIPanelType panelType) 6 { 7 //表示还没创建过这个面板,创建面板 8 if (panelDict == null) 9 { 10 panelDict = new Dictionary<UIPanelType, BasePanel>(); 11 } 12 13 //BasePanel panel; 14 //panelDict.TryGetValue(panelType, out panel);//TODO 15 //看以前是否创建过这个类型的面板 TryGet:根据类型得到 16 BasePanel panel = panelDict.TryGet(panelType); 17 18 if (panel == null) 19 { 20 //如果找不到,那么就找这个面板的prefab的路径,然后去根据prefab去实例化面板 21 //麻烦的方法根据Key得到value,因此将其作为扩展功能写在扩展类当中 22 //string path; 23 //panelPathDict.TryGetValue(panelType, out path); 24 string path = panelPathDict.TryGet(panelType); 25 GameObject instPanel = GameObject.Instantiate(Resources.Load(path)) as GameObject; 26 instPanel.transform.SetParent(CanvasTransform,false); //false:保持面板panel的局部rotation location的正常 27 panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());//把实例化好的面板保存起来 28 return instPanel.GetComponent<BasePanel>(); 29 } 30 else 31 { 32 return panel; 33 } 34 35 }
开发扩展字典类DictionaryExtension:
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 //扩展方法的语法知识: 5 /// <summary>:注释自动出来的方法,写好函数之后在函数上方加///系统会自动出来,///要在单独一行,前面没有代码 6 /// 对Dictory(系统内置的一个类)的扩展方法 7 /// </summary> 8 public static class DictionaryExtension {//扩展类也一定要是静态的 9 //用一个字典类型的就可以调用这个方法,此方法是字典的扩展方法,dict表示调用这个方法的字典(自动) 10 /// <summary> 11 /// 尝试根据key得到value,得到了的话直接返回value,没有得到直接返回null 12 /// 定义在字典外边,this Dictionary<Tkey,Tvalue> dict表示调用这个方法的字典 13 /// this Dictionary<Tkey,Tvalue> dict 这个字典表示我们要获取值的字典 14 /// </summary> 15 /// //扩展方法一定要是静态方法 16 public static Tvalue TryGet<Tkey, Tvalue>(this Dictionary<Tkey, Tvalue> dict, Tkey key) 17 { 18 Tvalue value; 19 dict.TryGetValue(key, out value); 20 return value; 21 } 22 23 }
以上是关于UI(UGUI)框架-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类的主要内容,如果未能解决你的问题,请参考以下文章
Unity-UI(UGUI详解)02.1 Canvas组件、Visual组件
Unity-UI(UGUI详解)02.1 Canvas组件、Visual组件
Unity使用UGUI实现王者荣耀UI界面加载页面(进度条)