Unity框架——UI管理
来源:互联网 发布:单片机数码管显示数字 编辑:程序博客网 时间:2024/05/19 09:47
1.BaseUI
using UnityEngine;using System.Collections;public class BaseUI : MonoBehaviour{ [HideInInspector] public string UIName; private Transform _transform; public Transform CacheTransform { get { if (_transform == null) { _transform = this.transform; } return transform; } } private GameObject _gameObject; public GameObject CacheGameObject { get { if(_gameObject==null) { _gameObject = this.gameObject; } return _gameObject; } } /// <summary> /// 绑定脚本并激活游戏物体调用的方法 /// </summary> void Awake() { OnAwake(); } /// <summary> /// 初始化UI,用于寻找组件等 /// </summary> public void Init() { OnInit(); } /// <summary> /// 显示当前UI /// </summary> /// <param name="objArgs">参数集</param> public void Show(params object[] objArgs) { CacheGameObject.SetActive(true); } /// <summary> /// 隐藏UI /// </summary> public void Hide() { CacheGameObject.SetActive(false); } #region 虚函数 /// <summary> /// 初始化 /// </summary> public virtual void OnInit() { } /// <summary> /// 唤醒 /// </summary> public virtual void OnAwake() { } /// <summary> /// 显示UI /// </summary> /// <param name="objArgs">参数</param> public virtual void OnShow(params object[] objArgs) { } /// <summary> /// 隐藏UI /// </summary> public virtual void OnHide() { } /// <summary> /// 删除UI /// </summary> public virtual void OnDestroy() { } #endregion}
2.UI管理者类
using UnityEngine;using System.Collections;using System.Collections.Generic;using System;public class UIManager : EventNode { #region 单例 private static UIManager instance; public static UIManager Instance { get { if (instance == null) { instance = (UIManager)FindObjectOfType(typeof(UIManager)); if (instance == null) { Debug.LogError("An instance of " + typeof(UIManager) + " is needed in the scene, but there is none."); } } return instance; } } #endregion private Dictionary<string, BaseUI> UIDic = new Dictionary<string, BaseUI>(); /// <summary> 命令集合 </summary> public List<Command> cmdList = new List<Command>(); /// <summary> /// 添加一个ui到ui集合中 /// </summary> /// <param name="ui">ui</param> public void AddUI(BaseUI ui) { UIDic[ui.UIName] = ui; } /// <summary> /// 移除UI从ui集合中 /// </summary> /// <param name="ui"></param> public void RemoveUI(BaseUI ui) { if(ui!=null&&UIDic.ContainsKey(ui.UIName)) { UIDic.Remove(ui.UIName); } } #region 创建UI /// <summary> /// 创建UI /// </summary> /// <param name="uiName">ui名</param> /// <param name="type">要绑定的脚本名</param> /// <param name="listener">创建完成回调</param> public void CreateUI(string uiName, Type type, ILoadUIListener listener) { cmdList.Add(new Command(Command.CmdType.Create,type,listener)); } /// <summary> /// 创建UI的实体部分 /// </summary> /// <param name="cmd">指令</param> private void _Create(Command cmd) { BaseUI ui = null; UIDic.TryGetValue(cmd.uiName,out ui); if (ui != null) { if (cmd.listener != null) { cmd.listener.Finish(ui); } else { ResManager.Instance.Load(cmd.uiName, new LoadResFinish(cmd)); } } } #endregion #region 显示UI /// <summary> /// 显示一个UI界面 如果不存在则创建一个 /// </summary> /// <param name="uiName">ui名称</param> /// <param name="type">要绑定的脚本</param> /// <param name="listener">如果界面不存在则会有加载完成后的回调</param> /// <param name="objArgs">参数</param> public void ShowUI(string uiName,Type type,ILoadUIListener listener,params object[] objArgs) { BaseUI ui=null; UIDic.TryGetValue(uiName,out ui); if(ui==null) { CreateUI(uiName, type, listener); } cmdList.Add(new Command(Command.CmdType.Show,uiName,objArgs)); } /// <summary> /// 显示一个界面 /// </summary> /// <param name="cmd">指令</param> private void _Show(Command cmd) { BaseUI ui=null; UIDic.TryGetValue(cmd.uiName, out ui); if(ui!=null) { ui.Show(); if(cmd.listener!=null) { cmd.listener.Finish(ui); } } } #endregion #region 隐藏UI /// <summary> /// 隐藏ui /// </summary> /// <param name="uiName">ui名</param> public void HideUI(string uiName) { cmdList.Add(new Command(Command.CmdType.Hide, uiName)); } /// <summary> /// 隐藏UI(实体部分) /// </summary> /// <param name="cmd">指令</param> public void _Hide(Command cmd) { BaseUI ui=null; UIDic.TryGetValue(cmd.uiName, out ui); if (ui != null) { ui.Hide(); } } #endregion #region 删除UI /// <summary> /// 删除一个UI /// </summary> /// <param name="uiName">ui名</param> public void DestroyUI(string uiName) { cmdList.Add(new Command(Command.CmdType.Destroy,uiName)); } /// <summary> /// 删除UI (实体部分) /// </summary> /// <param name="cmd">指令</param> private void _Destroy(Command cmd) { BaseUI ui=null; UIDic.TryGetValue(cmd.uiName, out ui); if (ui != null) { UIDic.Remove(ui.UIName); Destroy(ui.CacheGameObject); } } #endregion void Update() { if(cmdList.Count>0) { Command tempCmd = null; tempCmd = cmdList[0]; if(tempCmd==null) { cmdList.RemoveAt(0); } else { switch(tempCmd.cmdType) { case Command.CmdType.Create: _Create(tempCmd); break; case Command.CmdType.Show: _Show(tempCmd); break; case Command.CmdType.Hide: _Hide(tempCmd); break; case Command.CmdType.Destroy: _Destroy(tempCmd); break; } cmdList.RemoveAt(0); } } } /// <summary> /// UI资源加载完成的回调 /// </summary> public class LoadResFinish:IResLoadListener { public Command cmd; public LoadResFinish(Command _cmd) { cmd = _cmd; } public void Finished(object asset) { if(cmd ==null) { return; } GameObject gamObject = GameObject.Instantiate<GameObject>(asset as GameObject); gamObject.SetActive(false); BaseUI ui= gamObject.AddComponent(cmd.type)as BaseUI; ui.Init(); if(cmd.listener!=null) { cmd.listener.Finish(ui); } } public void Failed() { if (cmd.listener != null) { cmd.listener.Failed(); } } } /// <summary> /// 界面加载的回调 /// </summary> public interface ILoadUIListener { void Finish(BaseUI ui); void Failed(); } /// <summary> /// 操作UI指令集 /// </summary> public class Command { /// <summary> /// 指令类型 /// </summary> public enum CmdType { /// <summary> 创建 </summary> Create, /// <summary> 显示或者刷新 </summary> Show, /// <summary> 隐藏 </summary> Hide, /// <summary> 删除 </summary> Destroy, } /// <summary> ui名称 </summary> public string uiName; /// <summary> 要绑定的脚本 </summary> public Type type; /// <summary> 加载完成后的回调 </summary> public ILoadUIListener listener; /// <summary> 参数集合 </summary> public object[] objArgs; /// <summary> 命令类型 </summary> public CmdType cmdType; /// <summary> /// 构造函数(刷新页面) /// </summary> /// <param name="_cmdType">命令类型</param> /// <param name="_uiName">UI名</param> /// <param name="_objArgs">参数</param> public Command(CmdType _cmdType, string _uiName,params object[] _objArgs) { uiName = _uiName; cmdType = _cmdType; objArgs = _objArgs; } /// <summary> /// 构造函数(创建时的) /// </summary> /// <param name="_cmdType">命令类型</param> /// <param name="_type">脚本名</param> /// <param name="_listener">回调</param> public Command(CmdType _cmdType,Type _type,ILoadUIListener _listener) { cmdType = _cmdType; type = _type; listener = _listener; } }}
0 0
- Unity框架——UI管理
- Unity UI层级管理框架
- Unity游戏UI框架(三):窗体的层级管理
- Unity游戏UI框架(四):模态窗体管理
- Unity游戏UI框架(九):实现多语言管理
- Unity 简易UI框架
- Unity简单UI框架搭建
- Unity游戏UI框架(一)
- Unity开发UI框架搭建
- Unity 客户端框架(六):UI框架
- Unity 客户端框架(六):UI框架
- Unity UGUI——UI基础,Canvas
- Unity—UI正对摄像机
- Unity中简单 UI 管理类 - UIManager
- Unity UI事件管理系统设计
- Unity 基于Lua UI简单框架
- Unity游戏UI框架(五):配置管理
- Unity游戏UI框架(六):日志系统
- kafka常用命令
- SSH
- JavaScript中json字符串转换为json对象的几种方法
- Jsoup的使用
- 公元2050,网络漫谈
- Unity框架——UI管理
- CJOJ P2319 小学生
- React(四):虚拟DOM Diff算法解析
- 基于zookeeper的dubbo基础教程
- hello OpenCV
- Android简易自定义日历控件实践
- React Native通信机制详解
- VS2015+QT5开发,ui界面无法更新问题解决方法
- Install PG fail on windows: Problem running post-install step.