1. 程式人生 > >遊戲UI框架設計(二)

遊戲UI框架設計(二)

  1 public class UIManager : MonoBehaviour {
  2         /* 欄位 */
  3         private static UIManager _Instance = null;
  4         //UI窗體預設路徑(引數1:窗體預設名稱,2:表示窗體預設路徑)
  5         private Dictionary<string, string> _DicFormsPaths; 
  6         //快取所有UI窗體
  7         private Dictionary<string, BaseUIForm> _DicALLUIForms;
8 //當前顯示的UI窗體 9 private Dictionary<string, BaseUIForm> _DicCurrentShowUIForms; 10 //UI根節點 11 private Transform _TraCanvasTransfrom = null; 12 //全螢幕顯示的節點 13 private Transform _TraNormal = null; 14 //固定顯示的節點 15 private Transform _TraFixed = null
; 16 //彈出節點 17 private Transform _TraPopUp = null; 18 //UI管理指令碼的節點 19 private Transform _TraUIScripts = null; 20 21 22 /// <summary> 23 /// 得到例項 24 /// </summary> 25 /// <returns></returns> 26 public static UIManager GetInstance()
27 { 28 if (_Instance==null) 29 { 30 _Instance = new GameObject("_UIManager").AddComponent<UIManager>(); 31 } 32 return _Instance; 33 } 34 35 //初始化核心資料,載入“UI窗體路徑”到集合中。 36 public void Awake() 37 { 38 //欄位初始化 39 _DicALLUIForms=new Dictionary<string, BaseUIForm>(); 40 _DicCurrentShowUIForms=new Dictionary<string, BaseUIForm>(); 41 _DicFormsPaths=new Dictionary<string, string>(); 42 //初始化載入(根UI窗體)Canvas預設 43 InitRootCanvasLoading(); 44 //得到UI根節點、全屏節點、固定節點、彈出節點 45 _TraCanvasTransfrom = GameObject.FindGameObjectWithTag(SysDefine.SYS_TAG_CANVAS).transform; 46 _TraNormal = _TraCanvasTransfrom.Find("Normal"); 47 _TraFixed = _TraCanvasTransfrom.Find("Fixed"); 48 _TraPopUp = _TraCanvasTransfrom.Find("PopUp"); 49 _TraUIScripts = _TraCanvasTransfrom.Find("_ScriptMgr"); 50 //把本指令碼作為“根UI窗體”的子節點。 51 this.gameObject.transform.SetParent(_TraUIScripts, false); 52 //"根UI窗體"在場景轉換的時候,不允許銷燬 53 DontDestroyOnLoad(_TraCanvasTransfrom); 54 //初始化“UI窗體預設”路徑資料 55 //先寫簡單的,後面我們使用Json做配置檔案,來完善。 56 if (_DicFormsPaths!=null) 57 { 58 _DicFormsPaths.Add("LogonUIForm", @"UIPrefabs\LogonUIForm"); 59 } 60 } 61 62 /// <summary> 63 /// 顯示(開啟)UI窗體 64 /// 功能: 65 /// 1: 根據UI窗體的名稱,載入到“所有UI窗體”快取集合中 66 /// 2: 根據不同的UI窗體的“顯示模式”,分別作不同的載入處理 67 /// </summary> 68 /// <param name="uiFormName">UI窗體預設的名稱</param> 69 public void ShowUIForms(string uiFormName) 70 { 71 BaseUIForm baseUIForms=null; //UI窗體基類 72 73 //引數的檢查 74 if (string.IsNullOrEmpty(uiFormName)) return; 75 //根據UI窗體的名稱,載入到“所有UI窗體”快取集合中 76 baseUIForms = LoadFormsToAllUIFormsCatch(uiFormName); 77 if (baseUIForms == null) return; 78 //根據不同的UI窗體的顯示模式,分別作不同的載入處理 79 switch (baseUIForms.CurrentUIType.UIForms_ShowMode) 80 { 81 case UIFormShowMode.Normal: //“普通顯示”視窗模式 82 //把當前窗體載入到“當前窗體”集合中。 83 LoadUIToCurrentCache(uiFormName); 84 break; 85 case UIFormShowMode.ReverseChange: //需要“反向切換”視窗模式 86 //更靠後課程進行講解。 87 break; 88 case UIFormShowMode.HideOther: //“隱藏其他”視窗模式 89 //更靠後課程進行講解。 90 break; 91 default: 92 break; 93 } 94 } 95 96 #region 私有方法 97 //初始化載入(根UI窗體)Canvas預設 98 private void InitRootCanvasLoading() 99 { 100 ResourcesMgr.GetInstance().LoadAsset(SysDefine.SYS_PATH_CANVAS, false); 101 } 102 103 /// <summary> 104 /// 根據UI窗體的名稱,載入到“所有UI窗體”快取集合中 105 /// 功能: 檢查“所有UI窗體”集合中,是否已經載入過,否則才載入。 106 /// </summary> 107 /// <param name="uiFormsName">UI窗體(預設)的名稱</param> 108 /// <returns></returns> 109 private BaseUIForm LoadFormsToAllUIFormsCatch(string uiFormsName) 110 { 111 BaseUIForm baseUIResult = null; //載入的返回UI窗體基類 112 113 _DicALLUIForms.TryGetValue(uiFormsName, out baseUIResult); 114 if (baseUIResult==null) 115 { 116 //載入指定名稱的“UI窗體” 117 baseUIResult = LoadUIForm(uiFormsName); 118 } 119 120 return baseUIResult; 121 } 122 123 /// <summary> 124 /// 載入指定名稱的“UI窗體” 125 /// 功能: 126 /// 1:根據“UI窗體名稱”,載入預設克隆體。 127 /// 2:根據不同預設克隆體中帶的指令碼中不同的“位置資訊”,載入到“根窗體”下不同的節點。 128 /// 3:隱藏剛建立的UI克隆體。 129 /// 4:把克隆體,加入到“所有UI窗體”(快取)集合中。 130 /// 131 /// </summary> 132 /// <param name="uiFormName">UI窗體名稱</param> 133 private BaseUIForm LoadUIForm(string uiFormName) 134 { 135 string strUIFormPaths = null; //UI窗體路徑 136 GameObject goCloneUIPrefabs = null; //建立的UI克隆體預設 137 BaseUIForm baseUiForm=null; //窗體基類 138 139 140 //根據UI窗體名稱,得到對應的載入路徑 141 _DicFormsPaths.TryGetValue(uiFormName, out strUIFormPaths); 142 //根據“UI窗體名稱”,載入“預設克隆體” 143 if (!string.IsNullOrEmpty(strUIFormPaths)) 144 { 145 goCloneUIPrefabs = ResourcesMgr.GetInstance().LoadAsset(strUIFormPaths, false); 146 } 147 //設定“UI克隆體”的父節點(根據克隆體中帶的指令碼中不同的“位置資訊”) 148 if (_TraCanvasTransfrom != null && goCloneUIPrefabs != null) 149 { 150 baseUiForm = goCloneUIPrefabs.GetComponent<BaseUIForm>(); 151 if (baseUiForm == null) 152 { 153 Debug.Log("baseUiForm==null! ,請先確認窗體預設物件上是否載入了baseUIForm的子類指令碼! 引數 uiFormName=" + uiFormName); 154 return null; 155 } 156 switch (baseUiForm.CurrentUIType.UIForms_Type) 157 { 158 case UIFormType.Normal: //普通窗體節點 159 goCloneUIPrefabs.transform.SetParent(_TraNormal, false); 160 break; 161 case UIFormType.Fixed: //固定窗體節點 162 goCloneUIPrefabs.transform.SetParent(_TraFixed, false); 163 break; 164 case UIFormType.PopUp: //彈出窗體節點 165 goCloneUIPrefabs.transform.SetParent(_TraPopUp, false); 166 break; 167 default: 168 break; 169 } 170 171 //設定隱藏 172 goCloneUIPrefabs.SetActive(false); 173 //把克隆體,加入到“所有UI窗體”(快取)集合中。 174 _DicALLUIForms.Add(uiFormName, baseUiForm); 175 return baseUiForm; 176 } 177 else 178 { 179 Debug.Log("_TraCanvasTransfrom==null Or goCloneUIPrefabs==null!! ,Plese Check!, 引數uiFormName="+uiFormName); 180 } 181 182 Debug.Log("出現不可以預估的錯誤,請檢查,引數 uiFormName="+uiFormName); 183 return null; 184 }//Mehtod_end 185 186 /// <summary> 187 /// 把當前窗體載入到“當前窗體”集合中 188 /// </summary> 189 /// <param name="uiFormName">窗體預設的名稱</param> 190 private void LoadUIToCurrentCache(string uiFormName) 191 { 192 BaseUIForm baseUiForm; //UI窗體基類 193 BaseUIForm baseUIFormFromAllCache; //從“所有窗體集合”中得到的窗體 194 195 //如果“正在顯示”的集合中,存在整個UI窗體,則直接返回 196 _DicCurrentShowUIForms.TryGetValue(uiFormName, out baseUiForm); 197 if (baseUiForm != null) return; 198 //把當前窗體,載入到“正在顯示”集合中 199 _DicALLUIForms.TryGetValue(uiFormName, out baseUIFormFromAllCache); 200 if (baseUIFormFromAllCache!=null) 201 { 202 _DicCurrentShowUIForms.Add(uiFormName, baseUIFormFromAllCache); 203 baseUIFormFromAllCache.Display(); //顯示當前窗體 204 } 205 } 206 207 #endregion 208 209 }//class_end