Unity的UI界面管理器

  • 界面管理
  • 界面管理器的优势
  • 界面管理模式的流程图
  • 管理器脚本
    • Helper脚本
    • Manager脚本
    • WindowsManager脚本
  • Demo

界面管理

界面管理器的优势

界面管理器只是为了方便界面的管理能够更加方便的去管理每个界面的开关操作,但又不干涉其他界面的内部操作。
不至于像界面之间直接打开另一界面的操作,那样一旦界面过多或删除或添加一个界面都需要带动大量的代码,而这种统一的界面的打开关闭,添加或删除一个界面只会让原有的打开或关闭方法失效并不会直接导致工程因为错误而无法运行;而且打开或关闭所需要改动的代码非常的小

界面管理模式的流程图

#mermaid-svg-yvVdCedD9bmKNfz8 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .label text{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .node rect,#mermaid-svg-yvVdCedD9bmKNfz8 .node circle,#mermaid-svg-yvVdCedD9bmKNfz8 .node ellipse,#mermaid-svg-yvVdCedD9bmKNfz8 .node polygon,#mermaid-svg-yvVdCedD9bmKNfz8 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-yvVdCedD9bmKNfz8 .node .label{text-align:center;fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .node.clickable{cursor:pointer}#mermaid-svg-yvVdCedD9bmKNfz8 .arrowheadPath{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-yvVdCedD9bmKNfz8 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-yvVdCedD9bmKNfz8 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-yvVdCedD9bmKNfz8 .edgeLabel rect{opacity:0.9}#mermaid-svg-yvVdCedD9bmKNfz8 .edgeLabel span{color:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-yvVdCedD9bmKNfz8 .cluster text{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-yvVdCedD9bmKNfz8 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-yvVdCedD9bmKNfz8 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-yvVdCedD9bmKNfz8 .actor-line{stroke:grey}#mermaid-svg-yvVdCedD9bmKNfz8 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-yvVdCedD9bmKNfz8 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .sequenceNumber{fill:#fff}#mermaid-svg-yvVdCedD9bmKNfz8 #sequencenumber{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .messageText{fill:#333;stroke:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-yvVdCedD9bmKNfz8 .labelText,#mermaid-svg-yvVdCedD9bmKNfz8 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-yvVdCedD9bmKNfz8 .loopText,#mermaid-svg-yvVdCedD9bmKNfz8 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-yvVdCedD9bmKNfz8 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-yvVdCedD9bmKNfz8 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-yvVdCedD9bmKNfz8 .noteText,#mermaid-svg-yvVdCedD9bmKNfz8 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-yvVdCedD9bmKNfz8 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-yvVdCedD9bmKNfz8 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-yvVdCedD9bmKNfz8 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-yvVdCedD9bmKNfz8 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 .section{stroke:none;opacity:0.2}#mermaid-svg-yvVdCedD9bmKNfz8 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-yvVdCedD9bmKNfz8 .section2{fill:#fff400}#mermaid-svg-yvVdCedD9bmKNfz8 .section1,#mermaid-svg-yvVdCedD9bmKNfz8 .section3{fill:#fff;opacity:0.2}#mermaid-svg-yvVdCedD9bmKNfz8 .sectionTitle0{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .sectionTitle1{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .sectionTitle2{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .sectionTitle3{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-yvVdCedD9bmKNfz8 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 .grid path{stroke-width:0}#mermaid-svg-yvVdCedD9bmKNfz8 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-yvVdCedD9bmKNfz8 .task{stroke-width:2}#mermaid-svg-yvVdCedD9bmKNfz8 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 .taskText:not([font-size]){font-size:11px}#mermaid-svg-yvVdCedD9bmKNfz8 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-yvVdCedD9bmKNfz8 .task.clickable{cursor:pointer}#mermaid-svg-yvVdCedD9bmKNfz8 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-yvVdCedD9bmKNfz8 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-yvVdCedD9bmKNfz8 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-yvVdCedD9bmKNfz8 .taskText0,#mermaid-svg-yvVdCedD9bmKNfz8 .taskText1,#mermaid-svg-yvVdCedD9bmKNfz8 .taskText2,#mermaid-svg-yvVdCedD9bmKNfz8 .taskText3{fill:#fff}#mermaid-svg-yvVdCedD9bmKNfz8 .task0,#mermaid-svg-yvVdCedD9bmKNfz8 .task1,#mermaid-svg-yvVdCedD9bmKNfz8 .task2,#mermaid-svg-yvVdCedD9bmKNfz8 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-yvVdCedD9bmKNfz8 .taskTextOutside0,#mermaid-svg-yvVdCedD9bmKNfz8 .taskTextOutside2{fill:#000}#mermaid-svg-yvVdCedD9bmKNfz8 .taskTextOutside1,#mermaid-svg-yvVdCedD9bmKNfz8 .taskTextOutside3{fill:#000}#mermaid-svg-yvVdCedD9bmKNfz8 .active0,#mermaid-svg-yvVdCedD9bmKNfz8 .active1,#mermaid-svg-yvVdCedD9bmKNfz8 .active2,#mermaid-svg-yvVdCedD9bmKNfz8 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-yvVdCedD9bmKNfz8 .activeText0,#mermaid-svg-yvVdCedD9bmKNfz8 .activeText1,#mermaid-svg-yvVdCedD9bmKNfz8 .activeText2,#mermaid-svg-yvVdCedD9bmKNfz8 .activeText3{fill:#000 !important}#mermaid-svg-yvVdCedD9bmKNfz8 .done0,#mermaid-svg-yvVdCedD9bmKNfz8 .done1,#mermaid-svg-yvVdCedD9bmKNfz8 .done2,#mermaid-svg-yvVdCedD9bmKNfz8 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-yvVdCedD9bmKNfz8 .doneText0,#mermaid-svg-yvVdCedD9bmKNfz8 .doneText1,#mermaid-svg-yvVdCedD9bmKNfz8 .doneText2,#mermaid-svg-yvVdCedD9bmKNfz8 .doneText3{fill:#000 !important}#mermaid-svg-yvVdCedD9bmKNfz8 .crit0,#mermaid-svg-yvVdCedD9bmKNfz8 .crit1,#mermaid-svg-yvVdCedD9bmKNfz8 .crit2,#mermaid-svg-yvVdCedD9bmKNfz8 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-yvVdCedD9bmKNfz8 .activeCrit0,#mermaid-svg-yvVdCedD9bmKNfz8 .activeCrit1,#mermaid-svg-yvVdCedD9bmKNfz8 .activeCrit2,#mermaid-svg-yvVdCedD9bmKNfz8 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-yvVdCedD9bmKNfz8 .doneCrit0,#mermaid-svg-yvVdCedD9bmKNfz8 .doneCrit1,#mermaid-svg-yvVdCedD9bmKNfz8 .doneCrit2,#mermaid-svg-yvVdCedD9bmKNfz8 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-yvVdCedD9bmKNfz8 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-yvVdCedD9bmKNfz8 .milestoneText{font-style:italic}#mermaid-svg-yvVdCedD9bmKNfz8 .doneCritText0,#mermaid-svg-yvVdCedD9bmKNfz8 .doneCritText1,#mermaid-svg-yvVdCedD9bmKNfz8 .doneCritText2,#mermaid-svg-yvVdCedD9bmKNfz8 .doneCritText3{fill:#000 !important}#mermaid-svg-yvVdCedD9bmKNfz8 .activeCritText0,#mermaid-svg-yvVdCedD9bmKNfz8 .activeCritText1,#mermaid-svg-yvVdCedD9bmKNfz8 .activeCritText2,#mermaid-svg-yvVdCedD9bmKNfz8 .activeCritText3{fill:#000 !important}#mermaid-svg-yvVdCedD9bmKNfz8 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-yvVdCedD9bmKNfz8 g.classGroup text .title{font-weight:bolder}#mermaid-svg-yvVdCedD9bmKNfz8 g.clickable{cursor:pointer}#mermaid-svg-yvVdCedD9bmKNfz8 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-yvVdCedD9bmKNfz8 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-yvVdCedD9bmKNfz8 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-yvVdCedD9bmKNfz8 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-yvVdCedD9bmKNfz8 .dashed-line{stroke-dasharray:3}#mermaid-svg-yvVdCedD9bmKNfz8 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 .commit-id,#mermaid-svg-yvVdCedD9bmKNfz8 .commit-msg,#mermaid-svg-yvVdCedD9bmKNfz8 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-yvVdCedD9bmKNfz8 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-yvVdCedD9bmKNfz8 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-yvVdCedD9bmKNfz8 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-yvVdCedD9bmKNfz8 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-yvVdCedD9bmKNfz8 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-yvVdCedD9bmKNfz8 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-yvVdCedD9bmKNfz8 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-yvVdCedD9bmKNfz8 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-yvVdCedD9bmKNfz8 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-yvVdCedD9bmKNfz8 .edgeLabel text{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-yvVdCedD9bmKNfz8 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-yvVdCedD9bmKNfz8 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-yvVdCedD9bmKNfz8 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-yvVdCedD9bmKNfz8 .note-edge{stroke-dasharray:5}#mermaid-svg-yvVdCedD9bmKNfz8 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-yvVdCedD9bmKNfz8 .error-icon{fill:#522}#mermaid-svg-yvVdCedD9bmKNfz8 .error-text{fill:#522;stroke:#522}#mermaid-svg-yvVdCedD9bmKNfz8 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-yvVdCedD9bmKNfz8 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-yvVdCedD9bmKNfz8 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-yvVdCedD9bmKNfz8 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-yvVdCedD9bmKNfz8 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-yvVdCedD9bmKNfz8 .marker{fill:#333}#mermaid-svg-yvVdCedD9bmKNfz8 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-yvVdCedD9bmKNfz8 {color: rgba(0, 0, 0, 0.75);font: ;}

界面不存在
界面存在
界面未打开
界面已打开
初始化
加载所有界面预制
等待用户操作
打开UI界面
判断界面是否存在
打开界面失败
打开界面成功
关闭UI界面
判断界面是否打开
关闭界面失败
关闭界面成功
当前操作结束
开始下一操作

管理器脚本

Helper脚本

/// <summary>/// 帮助工具/// </summary>public class Helper : MonoBehaviour{private static Helper _Manager;/// <summary>/// /// </summary>public static Helper GetManager{get{if (_Manager == null){_Manager = GameObject.FindObjectOfType<Helper>();if (_Manager != null)return _Manager;GameObject Go = new GameObject("Helper");_Manager = Go.AddComponent<Helper>();}return _Manager;}}/// <summary>/// 存储文件///     当文件夹路径不存在时会自动创建文件夹/// </summary>/// <param name="path">存储路径</param>/// <param name="date">储存数据</param>/// <returns>存储文件成功或失败</returns>public static bool SaveFile(string path, byte[] date){try{if (string.IsNullOrEmpty(path) || date == null)return false;string[] vs = path.Split('/');string paths = null;for (int i = 0; i < vs.Length - 1; i++){if (i != 0)paths += "/" + vs[i];elsepaths += vs[i];}//判断文件夹是否存在if (!Directory.Exists(paths))Directory.CreateDirectory(paths);FileStream stream = new FileStream(path, FileMode.Create);stream.Write(date, 0, date.Length);stream.Close();}catch (Exception ex){Debug.Log(ex.Message);return false;}return true;}/// <summary>/// 判断文件是否存在/// </summary>/// <param name="varPath">文件路径</param>/// <returns></returns>public static bool FileExists(string varPath){if (string.IsNullOrEmpty(varPath))return false;FileInfo file = new FileInfo(varPath);return file.Exists;}/// <summary>/// 通过文件夹获取所有文件信息(不包含文件夹)/// </summary>/// <param name="varPath"></param>/// <returns></returns>public static FileInfo[] GetFileByDirectory(string varPath){if (Directory.Exists(varPath)){DirectoryInfo directory = new DirectoryInfo(varPath);return directory.GetFiles();}return null;}/// <summary>/// 查找组件/// </summary>/// <typeparam name="T"></typeparam>/// <param name="varTran"></param>/// <param name="varPath"></param>/// <returns></returns>public static T GetComponent<T>(Transform varTran, string varPath) where T : Component{if (varTran == null){Debug.Log("Tran Is Null");return null;}Transform TempTran = varTran.Find(varPath);if (TempTran != null)return TempTran.GetComponent<T>();else{string error = string.Format("{0}:Path:{1} is null", varTran.name, varPath);Debug.Log(error);return null;}}/// <summary>/// 从物体的上级(父级)查找组件/// </summary>/// <typeparam name="T"></typeparam>/// <param name="var_Tran"></param>/// <returns></returns>public static T GetComponent<T>(Transform var_Tran) where T : Component{if (var_Tran == null){Debug.LogError("Tran Is Null");return null;}Transform Parent = var_Tran.parent;if (Parent == null)return var_Tran.GetComponent<T>();T var_T = Parent.GetComponent<T>();if (var_T == null)return GetComponent<T>(Parent);elsereturn var_T;}/// <summary>/// 判断物体的上级是否包含某个物体/// </summary>/// <param name="varTran"></param>/// <param name="Parent"></param>/// <returns></returns>public static bool IsParent(Transform varTran, Transform Parent){if (varTran == null)return false;if (Parent == null)return false;if (varTran.parent == Parent)return true;elsereturn IsParent(varTran.parent, Parent);}/// <summary>/// 获取物体下的所有子集(不包含子集的子集)/// </summary>/// <param name="varTran"></param>/// <returns></returns>public static List<GameObject> GetGames(Transform varTran){if (varTran == null){Debug.Log("Tran is Null");return null;}List<GameObject> TrmpList = new List<GameObject>();int TempChildCount = varTran.childCount;for (int i = 0; i < TempChildCount; i++){Transform TempTran = varTran.GetChild(i);TrmpList.Add(TempTran.gameObject);}return TrmpList;}/// <summary>/// 设置物体的状态/// </summary>/// <param name="varGame"></param>/// <param name="path"></param>/// <param name="activeSelf"></param>public static void SetActive(GameObject varGame, bool activeSelf, string path = null){if (varGame == null){Debug.LogError("Game is null");return;}if (!string.IsNullOrEmpty(path)){var Tran = varGame.transform.Find(path);if (Tran == null){Debug.LogError("Game path is null");return;}Tran.gameObject.SetActive(activeSelf);}else{varGame.SetActive(activeSelf);}}/// <summary>/// 创建物体/// </summary>/// <param name="varName">物体的名称</param>/// <param name="varParent">物体的父级</param>/// <param name="varLayer">物体的标签层级</param>/// <returns></returns>public static GameObject NewGameObject(string varName, GameObject varParent, string varLayer = "UI"){GameObject TempGame = new GameObject(varName);if (varParent == null){TempGame.transform.SetParent(null);}else{TempGame.transform.SetParent(varParent.transform);}TempGame.transform.localPosition = Vector3.zero;TempGame.transform.localScale = Vector3.one;TempGame.transform.localEulerAngles = Vector3.zero;TempGame.layer = LayerMask.NameToLayer(varLayer);return TempGame;}/// <summary>/// 创建物体并挂载脚本/// </summary>/// <typeparam name="T">挂载的脚本类型</typeparam>/// <param name="varName">物体的名称</param>/// <param name="varParent">物体的父级</param>/// <param name="varLayer">物体的标签层级</param>/// <returns></returns>public static T NewGameObject<T>(string varName, GameObject varParent, string varLayer = "UI") where T : Component{GameObject TempGame = NewGameObject(varName, varParent);T Temp = TempGame.AddComponent<T>();return Temp;}/// <summary>/// 克隆物体并同步Transform信息/// </summary>/// <param name="varName"></param>/// <param name="varItem"></param>/// <returns></returns>public static GameObject InstantiateGameObject(string varName, GameObject varItem){if (varItem == null){return null;}GameObject TempClone = GameObject.Instantiate<GameObject>(varItem, varItem.transform.parent);TempClone.name = varName;TempClone.transform.localEulerAngles = varItem.transform.localEulerAngles;TempClone.transform.localPosition = varItem.transform.localPosition;TempClone.transform.localScale = varItem.transform.localScale;return TempClone;}/// <summary>/// 克隆物体并同步Transform信息/// </summary>/// <param name="varName"></param>/// <param name="varItem"></param>/// <param name="parent"></param>/// <returns></returns>public static GameObject InstantiateGameObject(string varName,Transform parent, GameObject varItem){if (varItem == null){return null;}GameObject TempClone = GameObject.Instantiate<GameObject>(varItem, parent);TempClone.name = varName;TempClone.transform.localEulerAngles = varItem.transform.localEulerAngles;TempClone.transform.localPosition = varItem.transform.localPosition;TempClone.transform.localScale = varItem.transform.localScale;return TempClone;}/// <summary>/// 移除数组中无效的字符串/// </summary>/// <param name="varContent"></param>/// <returns></returns>public static List<string> RemovedNullString(string[] varContent){List<string> LanguageList = new List<string>();for (int i = 0; i < varContent.Length; i++){if (string.IsNullOrEmpty(varContent[i]))continue;LanguageList.Add(varContent[i]);}return LanguageList;}/// <summary>/// 移除字符串中的标点符号/// </summary>/// <param name="varString"></param>/// <returns></returns>public static string RemovePunctuation(string varString){varString = varString.Replace("\\", "");varString = varString.Replace("\'", "");varString = varString.Replace("\"", "");varString = varString.Replace("/", "");varString = varString.Replace(";", "");varString = varString.Replace(":", "");varString = varString.Replace("(", "");varString = varString.Replace(")", "");varString = varString.Replace("<", "");varString = varString.Replace(">", "");varString = varString.Replace(",", "");varString = varString.Replace(".", "");varString = varString.Replace("{", "");varString = varString.Replace("}", "");varString = varString.Replace("[", "");varString = varString.Replace("]", "");varString = varString.Replace("-", "");varString = varString.Replace("_", "");varString = varString.Replace("+", "");varString = varString.Replace("=", "");varString = varString.Replace("*", "");varString = varString.Replace("&", "");varString = varString.Replace("……", "");varString = varString.Replace("%", "");varString = varString.Replace("¥", "");varString = varString.Replace("#", "");varString = varString.Replace("@", "");varString = varString.Replace("!", "");varString = varString.Replace("~", "");varString = varString.Replace("`", "");varString = varString.Replace("|", "");varString = varString.Replace("【", "");varString = varString.Replace("】", "");varString = varString.Replace("、", "");varString = varString.Replace("‘", "");varString = varString.Replace("“", "");varString = varString.Replace(";", "");varString = varString.Replace(":", "");varString = varString.Replace("《", "");varString = varString.Replace("》", "");varString = varString.Replace(",", "");varString = varString.Replace("。", "");varString = varString.Replace("?", "");varString = varString.Replace("?", "");varString = varString.Replace(")", "");varString = varString.Replace("—", "");varString = varString.Replace("(", "");varString = varString.Replace("*", "");varString = varString.Replace("!", "");varString = varString.Replace("·", "");varString = varString.Replace(" ", "");return varString;}/// <summary>/// 世界坐标转换成相对坐标/// </summary>/// <param name="origon"></param>/// <param name="position"></param>/// <returns></returns>public static Vector3 TransformVector(Transform origon, Vector3 position){Vector3 ConvertPos = origon.TransformVector(position);return ConvertPos;}/// <summary>/// 相对坐标转换成世界坐标/// </summary>/// <param name="origon"></param>/// <param name="position"></param>/// <returns></returns>public static Vector3 InverseTransformVector(Transform origon, Vector3 position){Vector3 ConvertPos = origon.InverseTransformVector(position);return ConvertPos;}#region 文件解析/// <summary>/// 解析Xml文件/// * ===============================/// * Xml文件的编写结构/// * /// * ===============================/// * <!--<?xml version="1.0"?>/// * <LogoXmlList>/// *   <LogoXmlinfo id="1" png="one"  />/// *   <LogoXmlinfo id="2" png="two" />/// * </LogoXmlList>/// * -->/// </summary>/// <typeparam name="T">/// * ===============================================/// * Xml用于解析的函数编写结构/// *          数据值用 属性变量编写/// * 如下为Xml解析结构的编写示例/// * ===============================================/// * public class LogoXmlinfo/// * {/// *     [XmlAttribute(AttributeName = "id")]/// *     public string id { set; get; }/// *     [XmlAttribute(AttributeName = "png")]/// *     public string Png { set; get; }/// * }/// * [XmlRoot("LogoXmlList")]/// * public class LogoXmlList/// * {/// *     [XmlElement("LogoXmlinfo")]/// *     public LogoXmlinfo[] Ins { set; get; }/// * }/// * ===============================================/// </typeparam>/// <param name="path"></param>/// <param name="ms"></param>public static void LoadXml<T>(string path, ref T ms) where T : class{try{using (TextReader reader = new StreamReader(path)){var serializer = new XmlSerializer(typeof(T));var items = (T)serializer.Deserialize(reader);if (items != null){ms = items;}}}catch (Exception ex){string str = string.Format("error: {0} is error {1}", path, ex.Message);Debug.LogError(str);}}/// <summary>/// 解析Json文件///     无法解析类结构嵌套/// * ===============================/// * Json文件的编写结构/// * /// * ===============================/// </summary>/// <typeparam name="T">/// * Json用于解析的函数编写结构/// * 数据值用 值变量编写不可用属性变量/// * 如下为Json解析结构的编写示例/// * =============================================/// *  public class JsonNotice/// *  {/// *      public string success;/// *      public string text;/// *  }/// * ============================================= /// </typeparam>/// <param name="content"></param>/// <returns></returns>public static T LoadJson<T>(string content) where T : class{content = content.Replace('\'', '"');Debug.Log(content);T TempT = JsonUtility.FromJson<T>(content);return TempT;}#endregion#region 数字转换/// <summary>/// 将数字转换成中文/// </summary>/// <param name="varNum"></param>/// <returns></returns>public static string Number(uint varNum){string Temp = Number(varNum, 0);if (Temp.Length > 16)return "零";string[] Temp_Str = new string[4];string Temp_string = "";for (int i = 3; i >= 0; i--){if (Temp.Length < i * 4){Temp_Str[i] = "";continue;}else{if (Temp.Length > (i + 1) * 4)Temp_Str[i] = Temp.Substring((Temp.Length - (i + 1) * 4), 4);elseTemp_Str[i] = Temp.Substring(0, (Temp.Length - i * 4));}string str = Temp_Str[i];Temp_Str[i] = Number(str);//1000万0000亿0000万0000if (Temp_Str[i] != null){if (i == 3)Temp_Str[i] += "万";if (i == 2)Temp_Str[i] += "亿";if (i == 1)Temp_Str[i] += "万";}Temp_string += Temp_Str[i];}while (Temp_string.Contains("零亿") || Temp_string.Contains("零万") || Temp_string.Contains("零千") || Temp_string.Contains("零百") || Temp_string.Contains("零十") || Temp_string.Contains("零零") || Temp_string.Contains("亿万")){Temp_string = Temp_string.Replace("零亿", "亿零");Temp_string = Temp_string.Replace("零万", "万零");Temp_string = Temp_string.Replace("零千", "零");Temp_string = Temp_string.Replace("零百", "零");Temp_string = Temp_string.Replace("零十", "零");Temp_string = Temp_string.Replace("零零", "零");Temp_string = Temp_string.Replace("亿万", "亿");}Temp_string = Temp_string.TrimEnd('零');//10000return Temp_string;}private static string Number(uint varNum, int idx){uint Temp_shi = varNum / 10;uint Tempge = varNum % 10;string Temp = "零";switch (Tempge){case 0:Temp = "零";break;case 1:Temp = "一";break;case 2:Temp = "二";break;case 3:Temp = "三";break;case 4:Temp = "四";break;case 5:Temp = "五";break;case 6:Temp = "六";break;case 7:Temp = "七";break;case 8:Temp = "八";break;case 9:Temp = "九";break;}if (Temp_shi > 0)Temp = Number(Temp_shi, idx + 1) + Temp;return Temp;}private static string Number(string str){if (string.IsNullOrEmpty(str))return "零";char[] car = str.ToCharArray();string TempStr = "";for (int i = 3; i >= 0; i--){char s = '0';if (((car.Length - 1) - i) < 0){TempStr = "";continue;}elses = car[(car.Length - 1) - i];if (i == 3)TempStr = TempStr + s + "千";else if (i == 2)TempStr = TempStr + s + "百";else if (i == 1)TempStr = TempStr + s + "十";else if (i == 0)TempStr = TempStr + s;}return TempStr;}#endregion#region Private#endregion}

Manager脚本

 /// <summary>/// 单利类型的基类(切换场景时单利会被初始化)/// </summary>/// <typeparam name="T"></typeparam>public class Manager<T> : MonoBehaviour where T : Component{private static T _Manager;/// <summary>/// /// </summary>public static T GetManager{get{if (_Manager == null){GetT();}return _Manager;}}/// <summary>/// /// </summary>/// <returns></returns>public static T Managers(){if (_Manager == null){GetT();}return _Manager;}private static T GetT(){var Temp_Type = typeof(T).Name;_Manager = GameObject.FindObjectOfType<T>();if (_Manager != null)return _Manager;GameObject Go = new GameObject(Temp_Type);_Manager = Go.AddComponent<T>();return _Manager;}/// <summary>/// 在继承中实现该方法可避免初始化/// </summary>void OnDestroy(){_Manager = null;}void Awake(){if (_Manager == null)_Manager = this.GetComponent<T>();OnAwake();}/// <summary>/// 使用OnAwake代替Awake/// </summary>protected virtual void OnAwake(){}/// <summary>/// 初始化/// </summary>public virtual void Init(){}

WindowsManager脚本

/// <summary>/// 窗口管理器(挂载在窗口上时可手动设置配置信息)/// /// 持久化问题:挂载时可手动设置(默认为持久化状态)/// /// 相机画布:挂载时可手动设置是否使用特殊相机(默认为使用)/// /// </summary>public class WindowsManager : Manager<WindowsManager>{/// <summary>/// 画布(挂载在窗口上时需要手动设置)/// </summary>[SerializeField]protected Canvas m_Canvas;/// <summary>/// 画布的响应信息/// </summary>[SerializeField]protected EventSystem m_EventSystem;/// <summary>/// 相机/// </summary>protected Camera m_Camera;/// <summary>/// 遮挡蒙版/// </summary>protected Transform m_Mask;/// <summary>/// 遮挡蒙版的颜色/// </summary>[SerializeField]protected Color m_Mask_Color = new Color(0, 0, 0, 0.4f);/// <summary>/// 废弃窗口/// </summary>protected Transform m_WastWindows;/// <summary>/// 打开窗口/// </summary>protected Transform m_OpenWindows;/// <summary>/// 设置窗口是否持久化/// </summary>[SerializeField]public bool IsDontDestroyOnLoad = true;/// <summary>/// 窗口是否为横屏/// </summary>public bool IsScene = true;/// <summary>/// 设置使用特殊相机/// </summary>[SerializeField]protected bool IsPeculiarCamera = true;/// <summary>/// 是否自动在Awake中初始化/// </summary>[SerializeField]private bool m_OnAwake = false;/// <summary>/// 所有打开的窗口/// </summary>protected Dictionary<string, Windows> All_OpenWindow = new Dictionary<string, Windows>();/// <summary>/// 所有关闭的窗口且未被销毁/// </summary>protected Dictionary<string, Windows> All_WastWindow = new Dictionary<string, Windows>();/// <summary>/// 所有的窗口预制信息/// </summary>protected Dictionary<string, GameObject> All_Windows = new Dictionary<string, GameObject>();/// <summary>/// OnAwake代替Awake,在Awake之后Start之前调用/// </summary>protected override void OnAwake(){base.OnAwake();if (m_OnAwake){Init();}}/// <summary>/// 窗口初始化需手动调用/// </summary>public override void Init(){CanvasInit();EventSystemInit();WindowsInit();if (IsDontDestroyOnLoad){GameObject.DontDestroyOnLoad(this.transform);if (!Helper.IsParent(m_Canvas.transform, this.transform))GameObject.DontDestroyOnLoad(m_Canvas.transform);if (!Helper.IsParent(m_EventSystem.transform, this.transform))GameObject.DontDestroyOnLoad(m_EventSystem.transform);}base.Init();}#region 初始化信息/// <summary>/// 相机的初始化/// </summary>protected virtual void CameraInit(GameObject Parent){if (m_Camera == null){GameObject varCamera = new GameObject("UI_Camera") { layer = LayerMask.NameToLayer("UI") };varCamera.transform.SetParent(Parent.transform);varCamera.transform.localPosition = (Vector3.back) * 5000;Camera TempCamera = varCamera.AddComponent<Camera>();TempCamera.clearFlags = CameraClearFlags.Depth;TempCamera.orthographic = true;TempCamera.orthographicSize = 1;TempCamera.cullingMask = 32;TempCamera.depth = 100;TempCamera.allowHDR = false;TempCamera.allowMSAA = false;varCamera.AddComponent<FlareLayer>();m_Camera = TempCamera;}}/// <summary>/// 画布初始化/// </summary>protected virtual void CanvasInit(){if (m_Canvas == null){m_Canvas = this.GetComponentInChildren<Canvas>();}if (m_Canvas == null){GameObject TempWindows = new GameObject("Canvas") { layer = LayerMask.NameToLayer("UI") };TempWindows.transform.SetParent(this.transform);TempWindows.transform.position = new Vector3(100000, 100000, 100000);TempWindows.transform.localScale = Vector3.one;TempWindows.transform.localEulerAngles = Vector3.zero;//设置画布Canvas TempCanvas = TempWindows.AddComponent<Canvas>();CanvasScaler TempCanvasScaler = TempWindows.AddComponent<CanvasScaler>();TempCanvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;if (IsScene)TempCanvasScaler.referenceResolution = new Vector2(1920, 1080);elseTempCanvasScaler.referenceResolution = new Vector2(1080, 1920);TempWindows.AddComponent<GraphicRaycaster>();if (!IsPeculiarCamera){TempCanvas.renderMode = RenderMode.ScreenSpaceOverlay;TempCanvasScaler.screenMatchMode = CanvasScaler.ScreenMatchMode.MatchWidthOrHeight;TempCanvasScaler.matchWidthOrHeight = 0;}else{TempCanvasScaler.screenMatchMode = CanvasScaler.ScreenMatchMode.Expand;TempCanvas.renderMode = RenderMode.ScreenSpaceCamera;TempCanvas.referencePixelsPerUnit = 100;CameraInit(TempCanvas.gameObject);TempCanvas.worldCamera = m_Camera;}m_Canvas = TempCanvas;}else{m_Canvas.enabled = true;}}/// <summary>/// 画布的响应事件初始化/// </summary>protected virtual void EventSystemInit(){if (m_EventSystem == null){//设置画布响应GameObject TempEvent = Helper.NewGameObject("EventSystem", this.gameObject);m_EventSystem = TempEvent.AddComponent<EventSystem>();TempEvent.AddComponent<StandaloneInputModule>();}else{m_EventSystem.transform.SetParent(this.transform);}}/// <summary>/// 存放信息初始化/// </summary>protected virtual void WindowsInit(){//设置废弃窗口存放点if (m_WastWindows == null){Transform TempWeast = NewGameObject("WastWindow", m_Canvas.transform);TempWeast.gameObject.SetActive(false);m_WastWindows = TempWeast;}//设置激活窗口存放点if (m_OpenWindows == null){Transform TempOpen = NewGameObject("OpenWindow", m_Canvas.transform);TempOpen.gameObject.SetActive(true);m_OpenWindows = TempOpen;}//设置蒙版if (m_Mask == null){Transform TempMask = NewGameObject("UIMask", m_OpenWindows);TempMask.gameObject.SetActive(false);Image TempUI = TempMask.gameObject.AddComponent<Image>();TempUI.color = m_Mask_Color;//new Color(0, 0, 0, 0.3f);m_Mask = TempMask;}}/// <summary>/// 创建物体/// </summary>/// <param name="varName">物体名称</param>/// <param name="varParent">物体的父级</param>/// <returns></returns>protected Transform NewGameObject(string varName, Transform varParent){GameObject TempGame = new GameObject(varName);RectTransform TempRect = TempGame.AddComponent<RectTransform>();TempRect.pivot = Vector2.one * 0.5f;TempRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 0);TempRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 0);TempRect.anchorMax = Vector2.one;TempRect.anchorMin = Vector2.zero;TempGame.transform.SetParent(varParent, false);TempGame.transform.localPosition = Vector3.zero;TempGame.transform.localScale = Vector3.one;TempGame.transform.localEulerAngles = Vector3.zero;TempGame.layer = LayerMask.NameToLayer("UI");return TempGame.transform;}#endregion#region public/// <summary>/// 添加一个Resources路径的窗口预制/// </summary>/// <param name="varName">窗口名称</param>/// <param name="varResourcesPath">预制的Resources路口</param>public void AddResourcesWindows(string varName, string varResourcesPath){GameObject TempGame = Resources.Load<GameObject>(varResourcesPath);if (TempGame == null){string str = string.Format("Windows Name:{0} Path:{1} does not exist", varName, varResourcesPath);Debug.LogError(str);return;}TempGame.SetActive(false);if (All_Windows.ContainsKey(varName)){string str = string.Format("Windows Name:{0} has been load", varName);Debug.LogError(str);All_Windows[varName] = TempGame;}else{All_Windows.Add(varName, TempGame);}}/// <summary>/// 添加一个窗口预制/// </summary>/// <param name="varName">窗口名称</param>/// <param name="TempGame">窗口预制</param>public void AddWindows(string varName, GameObject TempGame){if (TempGame == null){string str = string.Format("Windows Name:{0} Windows does not exist", varName);Debug.LogError(str);return;}TempGame.SetActive(false);if (All_Windows.ContainsKey(varName)){string str = string.Format("Windows Name:{0} has been load", varName);Debug.LogError(str);All_Windows[varName] = TempGame;}else{All_Windows.Add(varName, TempGame);}}/// <summary>/// 打开窗口/// </summary>/// <param name="varName">窗口名称</param>/// <param name="IsMask">是否使用蒙版</param>public GameObject OpenWindows(string varName, bool IsMask = false){if (!JudgeInitWindows())return null;return Open_Winsows(varName, IsMask, true);}/// <summary>/// 关闭窗口(将窗口隐藏)/// </summary>/// <param name="varName"></param>public void CloseWindows(string varName){Close_Windows(varName);}/// <summary>/// 关闭窗口(将窗口隐藏)/// </summary>/// <param name="varTran"></param>public void CloseWindows(Transform varTran){Close_Windows(varTran);}/// <summary>/// 关闭窗口(销毁窗口)/// </summary>/// <param name="varName"></param>public void DestroyWindows(string varName){Close_Windows(varName, true);}/// <summary>/// 关闭窗口(销毁窗口)/// </summary>/// <param name="varTran"></param>public void DestroyWindows(Transform varTran){Close_Windows(varTran, true);}#endregion#region private/// <summary>/// 判断窗口管理器是否初始化/// </summary>/// <returns></returns>protected bool JudgeInitWindows(){if (m_OpenWindows == null){Debug.LogError("Please call WindowManager.GetManager.Init Method");return false;}return true;}/// <summary>/// 打开窗口/// </summary>/// <param name="varName">窗口名称</param>/// <param name="IsMask">是否需要蒙版</param>/// <param name="IsLevel">是否参与顶层回调计算</param>/// <returns></returns>protected virtual GameObject Open_Winsows(string varName, bool IsMask, bool IsLevel){Windows Temp_CurrentWindows = null;if (All_WastWindow.ContainsKey(varName)){//将窗口从垃圾站中移除Temp_CurrentWindows = All_WastWindow[varName];if (JudeWindowsNull(Temp_CurrentWindows)){Temp_CurrentWindows = NewWindows(varName);}else{All_WastWindow.Remove(varName);All_OpenWindow.Add(varName, Temp_CurrentWindows);}}else if (All_OpenWindow.ContainsKey(varName)){//获取窗口Temp_CurrentWindows = All_OpenWindow[varName];if (JudeWindowsNull(Temp_CurrentWindows)){Temp_CurrentWindows = NewWindows(varName);}}else if (All_Windows.ContainsKey(varName)){//创建窗口Temp_CurrentWindows = NewWindows(varName);}else{//窗口不存在return null;}if (Temp_CurrentWindows.m_Windows == null){//窗口被用户手动清理(窗口实例不存在)foreach (var item in All_OpenWindow.Values){if (item.Level > Temp_CurrentWindows.Level)item.Level--;}}else{//设置窗口的蒙版信息Temp_CurrentWindows.m_IsMask = IsMask;//设置窗口的层数计算Temp_CurrentWindows.m_IsLevel = IsLevel;//将窗口打开置顶ActivateWindowsTop(Temp_CurrentWindows);}//设置蒙版CommandMask();return Temp_CurrentWindows.m_Windows;}/// <summary>/// 关闭窗口/// </summary>/// <param name="varName">窗口名称</param>/// <param name="IsDestroy">是否销毁</param>protected virtual void Close_Windows(string varName, bool IsDestroy = false){if (!All_OpenWindow.ContainsKey(varName)){Debug.LogError("Windows Name:" + varName + " Is Not Open");return;}Windows windows = All_OpenWindow[varName];All_OpenWindow.Remove(varName);//关闭时调节窗口层级foreach (var item in All_OpenWindow.Values){if (item.Level > windows.Level){item.Level--;}}windows.Level = int.MaxValue;if (IsDestroy)GameObject.Destroy(windows.m_Windows);else{windows.m_Windows.transform.SetParent(m_WastWindows, false);All_WastWindow.Add(windows.m_WindowType, windows);}CommandMask();}/// <summary>/// 关闭窗口/// </summary>/// <param name="varTran">窗口实例</param>/// <param name="IsDestroy">是否销毁</param>protected virtual void Close_Windows(Transform varTran, bool IsDestroy = false){foreach (var item in All_OpenWindow.Values){if (item.m_Windows.transform == varTran){Close_Windows(item.m_WindowType, IsDestroy);return;}}Debug.LogError("Windows Is Not Open");return;}/// <summary>/// 创建一个窗口/// </summary>/// <param name="varName">窗口名称</param>/// <returns></returns>protected virtual Windows NewWindows(string varName){if (!All_Windows.ContainsKey(varName)){Debug.LogError("Windows Name:" + varName + " not exist");return null;}Windows TempWindows = new Windows();GameObject TempGame = All_Windows[varName];GameObject Temp_Game = GameObject.Instantiate(TempGame);Temp_Game.name = TempGame.name;TempWindows.m_WindowType = varName;TempWindows.m_Windows = Temp_Game;TempWindows.Level = int.MaxValue;All_OpenWindow.Add(varName, TempWindows);return TempWindows;}/// <summary>/// 打开一个窗口置顶/// </summary>protected virtual void ActivateWindowsTop(Windows varWindows){foreach (var item in All_OpenWindow){if (item.Value.Level > varWindows.Level){item.Value.Level--;}}varWindows.m_Windows.gameObject.SetActive(true);varWindows.m_Windows.transform.SetParent(m_OpenWindows, false);varWindows.m_Windows.transform.SetAsLastSibling();varWindows.Level = All_OpenWindow.Count - 1;}/// <summary>/// 控制蒙版/// </summary>protected virtual void CommandMask(){m_Mask.gameObject.SetActive(false);List<Windows> TempList = new List<Windows>(All_OpenWindow.Values);TempList.Sort((s1, s2) => { return s1.Level - s2.Level; });if (TempList.Count > 0){for (int i = TempList.Count - 1; i >= 0; i--){if (TempList[i].m_IsMask){m_Mask.SetSiblingIndex(TempList[i].Level);m_Mask.gameObject.SetActive(true);break;}}}}/// <summary>/// 当窗口实例被用户手动清理时/// 处理掉已不存在的窗口占用的层级/// </summary>/// <param name="varWindows">问题窗口</param>/// <returns></returns>protected virtual bool JudeWindowsNull(Windows varWindows){if (varWindows.m_Windows == null && All_OpenWindow.ContainsValue(varWindows)){foreach (var item in All_OpenWindow.Values){if (item.Level > varWindows.Level)item.Level--;}All_OpenWindow.Remove(varWindows.m_WindowType);return true;}else if (varWindows.m_Windows == null && All_WastWindow.ContainsValue(varWindows)){All_WastWindow.Remove(varWindows.m_WindowType);return true;}return false;}#endregion/// <summary>/// 窗口信息/// </summary>protected class Windows{/// <summary>/// 窗口类型/// </summary>public string m_WindowType;/// <summary>/// 窗口的示例/// </summary>public GameObject m_Windows;/// <summary>/// 窗口是否有蒙版/// </summary>public bool m_IsMask;/// <summary>/// 窗口是否参与层数计算/// </summary>public bool m_IsLevel;/// <summary>/// 当前窗口位于的层数/// </summary>public int Level;}}

Demo

百度云盘路径
提取码: ww2i

Unity的UI界面管理器相关推荐

  1. Unity中UI界面颤抖解决方法

    Unity中UI界面颤抖解决方法 参考文章: (1)Unity中UI界面颤抖解决方法 (2)https://www.cnblogs.com/Study088/p/7290909.html 备忘一下.

  2. unity全局总的音频管理器

    这篇博客介绍一个unity的总的音频管理器 可以有效避免音频错乱的问题 我们把它挂在场景中 可以使用跨场景保存的方法来实现场景跳转之后的存在 首先 这篇博客会用到我之前介绍的知识 我下面把链接先给大家 ...

  3. unity中ui界面介绍

    unity中ui界面的介绍 ui 又称gui,它比较适合做一些简单的界面. 可以在层级视图中右键单击就会出现很多选项卡,其中有一个就是ui单击就会出现如上图片中的内容 1.text: 这就是一个文本输 ...

  4. kubernetes:部署kubeapps应用,为Helm提供web UI界面管理

    kubernetes 部署kubeapps应用,为Helm提供web UI界面管理 部署kubeapps应用,为Helm提供web UI界面管理 [kubeadm@server2 ~]$ helm r ...

  5. unity中UI界面的一些动画实现总结

    在做unity的ui界面的时候,美术通常会实现一些动画效果.这里列举几个: 1.位置的变化 2.旋转的变化 3.缩放的变化 4.alpha的变化 5.颜色的变化 我们举一个例子: 位置的变化: (1) ...

  6. Unity入门——UI界面

    UI是在游戏上的显示页面,是让一些设置和数据在一些特定的地方摆放着,创建一个UI界面,要在 Hierarchy 中右键单击一个空白位置,或使用 Hierarchy 顶部的 Create 按钮,然后选择 ...

  7. unity在UI界面上展示旋转模型

    1.创建一个Raw Image用来在UI界面进行显示模型 2.将图片在界面调整到合适位置,根据自己的需要进行调整 3.在Assets文件夹下创建"渲染器纹理" 后面如果觉得显示不够 ...

  8. 【Unity实战100例】Unity循环UI界面切换卡片功能

    目录 ​编辑 一:制作UI界面 二:代码逻辑 1.定义基础变量

  9. 暗黑破坏神2重置版 UI界面管理类分析

    前言: 工作关系一直关注暴雪的游戏,这次来分析下暗黑2重置版里的UI界面数据结构.由于游戏有着各种猥琐的反调检测和保护,所以非专业人士只能使用伪调试的方式进行静态分析. 开始工作: 起手一个字符串枚举 ...

  10. 【Unity】UI界面展示3D模型

    方法一: 场景中同时使用2个相机,UI相机渲染UI输出到屏幕,3D相机将3D物体渲染到RenderTexture,也显示在UI,通过UI输出到屏幕. 使用RenderTexture.RawImage作 ...

最新文章

  1. Description Resource Path Location Type Java compiler level does not match the version of the instal
  2. 95cloud云主机管理系统 使用手册 图片去网站看吧
  3. java write int,void write(byte[] b, int off, int len)
  4. Opencv中Mat的data数据只定义为uchar*类型,
  5. 频繁默认网关不可用_win10 总是默认网关不可用,怎么回事?
  6. 出现ESXi系统无法连接FreeNAS的情况?90%以上的人都做错了!
  7. 安徽信息技术初中会考上机考试模拟_初中信息技术会考模拟试题
  8. TCP/IP协议栈的封装
  9. 一天一小段js代码(no.4)
  10. MyBatis拦截器执行顺序
  11. visio软件接口流程图_绘制流程图——Visio可以让你事半功倍哦!
  12. ps画笔工具、填充选区文字工具、合成
  13. R语言读取(加载)txt格式数据为dataframe、按照指定字段(数据列)对dataframe进行升序排序(ascending)、返回行索引的位置向量
  14. JS常用字符串方法复习
  15. 【PC端聊天功能模板】vue-elementul简单实现电脑端客服聊天功能,pc端聊天系统静态页面布局,配套websocket方案和心跳重连机制【详细注释,拿来即用】
  16. 五个真实的数据挖掘故事
  17. 【定制项目】【M13】【数据监控 + 数据分析 + 可视化大屏】- 关键技术 python flask + pandas + echarts + excel
  18. 威海海燕计算机学校,与中成学校一起成长 ——高海燕
  19. nagiosxi 监控Linux系统
  20. compileflow流程引擎使用

热门文章

  1. alios是安卓吗_阿里云OS到底是国产系统还是安卓系统?
  2. nginx+mysql8+php8建站
  3. PCB绘制成长日记1
  4. mysql 自定义插件调试
  5. 大龄程序员找工作,为什么这么难?
  6. 大龄程序员找不到工作,程序员真的是吃青春饭的吗?
  7. 51单片机dds信号发生器 扫频 c语言,基于DDS正弦信号发生器设计.doc
  8. 程序员转正述职报告_程序员个人述职报告范文4篇(整理版)
  9. dropbox 怎么使用_如何在一台PC上使用多个Dropbox帐户
  10. 2021阿里巴巴国际站产品关键词来源(一)