unity UIForm框架的核心功能逻辑- UI管理器 矫情吗;* 2023-07-12 05:30 2阅读 0赞 UI框架核心的四个类: **UIManager**(窗体UI管理器), **BaseUIForm** (窗体UI基类), **UIType** ( 窗体类型), **SysDefine** (公用对象定义) 下面是UI窗体管理器 UIManager **Awake()** 窗体字段 加载根窗体Canvas预设 ** InitRootCanvasLoading()** ** ** LoadAsset(PATH\_CANVAS) 得到各节点 FindGameObject 把管理器脚本做为根窗体子节点 SetParent(\_TraUIScripts) 场景转换不销毁根窗体 DontDestroyOnLoad() 提取所有预设路径 \_DicFormsPaths.Add **ShowUIForms()** 1、根据名称加载到 “所有UI窗体” 集合\_DicAllUIForm中 ** LoadFormsToAllUIFormsCatch** **LoadUIForm** (0. 根据窗体名称,得到路径,加载“预设的克隆体” \_DicFormsPaths.TryGetValue (1. 根据预设体路径,加载预设的克隆体。 ResourcesMgr.LoadAsset (2. 设置“UI克隆体”的父节点(根据克隆体中带的脚本中不同的“位置信息”) goCloneUIPrefabs.SetParent (3. 设置克隆体暂时隐藏 goCloneUIPrefabs.SetActive(false); (4. 把克隆体,加入到“所有UI窗体” (缓存)集合中。 \_DicAllUIForms.Add() 2、不同的显示模式加载** LoadUIToCurrentCache** ** ** switch(ShowMode) Normal ReverseChange HideOther **LoadUIToCurrentCache(** uiFormName **)** **\_DicCurrentShowUIForms**.TryGetValue(**out** baseUiForm); \_DicAllUIForms.TryGetValue(**out** baseUIFormFromAllCache); **\_DicCurrentShowUIForms.Add**(); baseUIFormFromAllCache**.Display()**; **完整代码:** using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// UI管理器 /// 是UI框架的核心功能逻辑 /// </summary> namespace UIFrame \{ /// <summary> /// 定义UI管理器:单例模式,在游戏对象创建时脚本组件能自动挂载上去 /// </summary> public class **UIManager :** MonoBehaviour \{ // 定义一个单例模式的私有字段,创建实例变量 private static UIManager \_Instance = null; // 定义UI窗体预设路径(参数1:窗体预设名称, 2:窗体预设路径 ) private Dictionary<string, string> **\_DicFormsPaths****;** // 缓存所有UI窗体 private Dictionary<string, BaseUIForm> **\_DicAllUIForms****;** // 当前已经打开的UI窗体 private Dictionary<string, BaseUIForm> **\_DicCurrentShowUIForms****;** // 定义UI根节点 private Transform** ****\_TraCanvasTransfrom** = null; // 全屏幕显示的节点 private Transform** ****\_TraNormal** = null; // 固定显示的节点 private Transform **\_TraFixed** = null; // 弹出节点 private Transform **\_TraPopUp** = null; // UI管理脚本的节点 private Transform **\_TraUIScripts** = null; // 得到实例 public static UIManager GetInstance() \{ if (\_Instance==null) \{ \_Instance = new GameObject("\_UIManager").AddComponent<UIManager>(); \} return \_Instance; \} ** // 初始化核心数据,加载“UI窗体路径”到集合中 ** ** public void Awake ( )** \{ ** ** **// 1. UI窗体字段初始化** \_DicFormsPaths = new Dictionary<string, string>(); \_DicAllUIForms = new Dictionary<string, BaseUIForm>(); \_DicCurrentShowUIForms = new Dictionary<string, BaseUIForm>(); ** ** ** // 2. 初始化加载根UI窗体Canvas预设** ** ** **InitRootCanvasLoading();** ** ** ** // 3. 得到UI根节点、全屏节点、固定节点、弹出节点** \_TraCanvasTransfrom = GameObject.FindGameObjectWithTag(SysDefine.SYS\_TAG\_CANVAS).transform; //\_TraCanvasTransfrom = GameObject.FindGameObjectWithTag("\_TagCanvas").transform; \_TraNormal = \_TraCanvasTransfrom.Find("Normal"); \_TraFixed = \_TraCanvasTransfrom.Find("Fixed"); \_TraPopUp = \_TraCanvasTransfrom.Find("PopUp"); \_TraUIScripts = \_TraCanvasTransfrom.Find("\_ScriptMgr"); // **4.** 把本脚本(**UIManager**)做为 “根UI窗体 **\_ScriptMgr** ” 的子节点 ** this.gameObject.transform.SetParent( **\_TraUIScripts, false **);** ** ** ** // 5. “根UI窗体”在场景转换时不允许销毁** ** DontDestroyOnLoad( **\_TraCanvasTransfrom **);** **// 6. 初始化UI“窗体预设”路径数据, 提取所有预设的路径到集合中** //先写简单的,后面再用json做配置文件 if(\_DicFormsPaths!=null) \{ \_DicFormsPaths**.Add**("LogonUIForm", @"UIPrefabs\\LogonUIForm"); \} \} // 初始化加载根UI窗体Canvas预设 private void **InitRootCanvasLoading**() \{ // Resources.Load("Canvas"); unity自带的Resource类效率太低,把缓存加进去封装一下 ResourcesMgr.GetInstance().LoadAsset(SysDefine.SYS\_PATH\_CANVAS, false); \} /// <summary> ** /// 打开UI窗体的公共方法** /// 功能: /// 1. 根据UI窗体的名称找到相应路径进行加载到缓存集合 /// 2. 根据定义好的显示模式进行加载不同的UI窗体 /// </summary> ** public void ShowUIForms (string uiFormName)** \{ BaseUIForm baseUIForms=null; // UI窗体基类 // 参数检查 if (string.IsNullOrEmpty(uiFormName)) return; ** // 1. 根据UI窗体的名称找到相应路径加载到缓存集合** baseUIForms = **LoadFormsToAllUIFormsCatch( **uiFormName **)**; if (baseUIForms == null) return; ** // 2. 根据定义好的显示模式加载不同的UI窗体** ** switch** (baseUIForms.CurrentUIType.UIForms\_ShowMode) \{ case UIFormShowMode.Normal: // 普通显示窗口模式 // 把当前窗体加载到“当前窗体”集合中 **LoadUIToCurrentCache( **uiFormName **)**; // Todo... break; case UIFormShowMode.ReverseChange: // 需要反向切换窗口模式 // Todo... break; case UIFormShowMode.HideOther: // 隐藏其它窗口模式 // Todo... break; default: break; \} \} /// <summary> /// 根据UI窗体的名称找到相应路径加载到缓存集合 /// 功能: 检查所有UI窗体集合中,是否已经加载过了,否则才加载 /// </summary> /// <param name="uiFormsName">UI窗体预设的名称</param> /// <returns></returns> private BaseUIForm **LoadFormsToAllUIFormsCatch****( **string uiFormsName **)** \{ // 检查之前是否加载过,如果没有就加载 BaseUIForm baseUIResult = null; // 加载的返回UI窗体基类 \_DicAllUIForms.TryGetValue(uiFormsName, out baseUIResult); if (baseUIResult == null) \{ // 加载指定路径的 UI窗体 baseUIResult =**LoadUIForm****( **uiFormsName **);** \} return baseUIResult; \} /// <summary> /// 加载指定名称的 UI窗体 /// 功能: /// 1. 根据“UI窗体名称”,加载预设克隆体。 /// 2. 根据不同预设克隆体中带的脚本中不同的“位置信息”,加载到“根窗体”下不同的节点。 /// 3. 隐藏刚创建的UI克隆体。 /// 4. 把克隆体加入到“所有UI窗体”缓存集合中 /// </summary> /// <param name="uiFormName">UI窗体名称</param> private BaseUIForm **LoadUIForm**(string uiFormName) \{ string strUIFormPaths = null; // UI窗体路径 GameObject goCloneUIPrefabs = null; // 创建的UI克隆体预设 BaseUIForm baseUIForm = null; // 窗体基类 **// 1. 根据UI窗体名称,得到对应的加载路径** \_DicFormsPaths**.TryGetValue**(uiFormName, out strUIFormPaths); // 根据“UI窗体名称”,**加载“预设克隆体”** if (!string.IsNullOrEmpty(strUIFormPaths)) \{ goCloneUIPrefabs = **ResourcesMgr**.GetInstance().**LoadAsset(** strUIFormPaths, false **);** \} **// 2. 设置“UI克隆体”的父节点(根据克隆体中带的脚本中不同的“位置信息”)** if(\_TraCanvasTransfrom!=null && goCloneUIPrefabs!=null) \{ baseUIForm = goCloneUIPrefabs.**GetComponent**<BaseUIForm>(); if(baseUIForm==null) \{ Debug.Log("baseUIForm==null!, 请先确认窗体预设对象上是否加载了baseUIForm的子类脚本! 参数uiFormName=" + uiFormName); return null; \} switch (baseUIForm.CurrentUIType.UIForms\_Type) \{ case UIFormType.Normal: goCloneUIPrefabs.transform.SetParent(\_TraNormal, false); break; case UIFormType.Fixed: goCloneUIPrefabs.transform.SetParent(\_TraFixed, false); break; case UIFormType.PopUP: goCloneUIPrefabs.transform.SetParent(\_TraPopUp, false); break; default: break; \} **// 3. 设置隐藏** goCloneUIPrefabs**.SetActive**(false); ** // 4. 把克隆体,加入到“所有UI窗体” (缓存)集合中。** \_DicAllUIForms**.Add( **uiFormName, baseUIForm **);** return baseUIForm; \} else \{ Debug.Log("\_TraCanvasTransform==null or goCloneUIPrefabs==null, Please check!, 参数 uiFormName=" + uiFormName); \} Debug.Log("出现不可预估的错误。 参数 uiFormName=" + uiFormName); return null; \} // Method\_end /// <summary> ** /// 把当前窗体加载到“当前窗体”集合中** /// </summary> /// <param name="uiFormName">窗体预设的名称</param> private void **LoadUIToCurrentCache(**string uiFormName) \{ BaseUIForm baseUiForm; // UI窗体基类 BaseUIForm baseUIFormFromAllCache; // 从所有窗体集合中得到窗体 // 如果“正在显示”的集合中,存在整个UI窗体,则直接返回 \_DicCurrentShowUIForms**.TryGetValue**(uiFormName, **out** baseUiForm); if (baseUiForm != null) return; // 如果“所有窗体”的集合中,存在当前窗体 \_DicAllUIForms**.TryGetValue**(uiFormName, **out** baseUIFormFromAllCache); if(baseUIFormFromAllCache!=null) \{ // 则把当前窗体加载到“正在显示”集合中 \_DicCurrentShowUIForms**.Add**(uiFormName, baseUIFormFromAllCache); baseUIFormFromAllCache**.Display()**; // 显示当前窗体 \} \} \} // class\_end \} // namespace\_end
还没有评论,来说两句吧...