UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类
UIManage单实例:
/// 单例模式的核心
/// 1,定义一个静态的对象 在外界访问 在内部构造
/// 2,构造方法私有化 private static UIManager _instance; public static UIManager Instance
{
get
{
if (_instance == null)
{
_instance = new UIManager();
}
return _instance;
}
}
//构造方法私有化
private UIManager()
{
//解析json文件
ParseUIPanelTypeJson();
}
创建GameRoot脚本:启动UI(作为启动面板的入口)
using UnityEngine;
using System.Collections; public class GameRoot : MonoBehaviour { // Use this for initialization
void Start () {
UIManager.Instance.PushPanel(UIPanelType.MainMenu);
} }
BasePanel面板基类(面板共有的基类,将面板相同的属性与行为抽象出来):
using UnityEngine;
using System.Collections; public class BasePanel : MonoBehaviour {
/// <summary>
/// 界面被显示出来
/// </summary>
public virtual void OnEnter()
{ } /// <summary>
/// 界面暂停
/// </summary>
public virtual void OnPause()
{ } /// <summary>
/// 界面继续
/// </summary>
public virtual void OnResume()
{ } /// <summary>
/// 界面不显示,退出这个界面,界面被关系
/// </summary>
public virtual void OnExit()
{ }
}
每一个项目里面的面板不一样,也就自己要去创建面板类(继承于BasePanel面板基类):
要在UIManage管理所有的面板:
/// <summary>
/// 根据面板类型 得到实例化的面板
/// </summary>
/// <returns></returns>
private BasePanel GetPanel(UIPanelType panelType)
{
//表示还没创建过这个面板,创建面板
if (panelDict == null)
{
panelDict = new Dictionary<UIPanelType, BasePanel>();
} //BasePanel panel;
//panelDict.TryGetValue(panelType, out panel);//TODO
//看以前是否创建过这个类型的面板 TryGet:根据类型得到
BasePanel panel = panelDict.TryGet(panelType); if (panel == null)
{
//如果找不到,那么就找这个面板的prefab的路径,然后去根据prefab去实例化面板
//麻烦的方法根据Key得到value,因此将其作为扩展功能写在扩展类当中
//string path;
//panelPathDict.TryGetValue(panelType, out path);
string path = panelPathDict.TryGet(panelType);
GameObject instPanel = GameObject.Instantiate(Resources.Load(path)) as GameObject;
instPanel.transform.SetParent(CanvasTransform,false); //false:保持面板panel的局部rotation location的正常
panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());//把实例化好的面板保存起来
return instPanel.GetComponent<BasePanel>();
}
else
{
return panel;
} }
开发扩展字典类DictionaryExtension:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//扩展方法的语法知识:
/// <summary>:注释自动出来的方法,写好函数之后在函数上方加///系统会自动出来,///要在单独一行,前面没有代码
/// 对Dictory(系统内置的一个类)的扩展方法
/// </summary>
public static class DictionaryExtension {//扩展类也一定要是静态的
//用一个字典类型的就可以调用这个方法,此方法是字典的扩展方法,dict表示调用这个方法的字典(自动)
/// <summary>
/// 尝试根据key得到value,得到了的话直接返回value,没有得到直接返回null
/// 定义在字典外边,this Dictionary<Tkey,Tvalue> dict表示调用这个方法的字典
/// this Dictionary<Tkey,Tvalue> dict 这个字典表示我们要获取值的字典
/// </summary>
/// //扩展方法一定要是静态方法
public static Tvalue TryGet<Tkey, Tvalue>(this Dictionary<Tkey, Tvalue> dict, Tkey key)
{
Tvalue value;
dict.TryGetValue(key, out value);
return value;
} }
UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类的更多相关文章
- UI(UGUI)框架(一)---------概述与保存/读取面板类型与路径
01.概念:管理场景中所有的面板,控制面板之间的跳转 02.项目层级目录: Resources:存放UIPanel,习惯把所有的一个个面板做成预制源,使用时加载 Scenes:存放场景 UIFrame ...
- Android 开发工具类 10_Toast 统一管理类
Toast 统一管理类: 1.短时间显示Toast: 2.长时间显示 Toast: 3.自定义显示 Toast 时间. import android.content.Context; import a ...
- Android 开发工具类 05_Logcat 统一管理类
Logcat 统一管理类: 1.默 认tag 的函数: 2.自定义 tag 的函数. import android.util.Log; // Logcat 统一管理类 public class L { ...
- 基于Python3 + appium的Ui自动化测试框架
UiAutoTest 一.概要 数据驱动的Ui自动化框架 二.环境要求 框架基于Python3 + unittest + appium 运行电脑需配置adb.aapt的环境变量,build_tools ...
- 《C#微信开发系列(2)-自定义菜单管理》
2.0自定义菜单管理 ①接口说明 微信服务号聊天窗口下面的菜单项(有的公众号有启用有的则没有),这个可以在编辑模式简单配置,也可以在开发模式代码配置.微信公众平台开发者文档:微信公众号开发平台创建自定 ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- web前端开发常用的10个高端CSS UI开源框架
web前端开发常用的10个高端CSS UI开源框架 随着人们对体验的极致追求,web页面设计也面临着新的挑战,不仅需要更人性化的设计理念,还需要设计出更酷炫的页面.作为web前端开发人员,运用开源 ...
- 分享一个UI与业务逻辑分层的框架(二)
序言 第一篇讲解了UI与业务逻辑分层的框架(UIMediator)的使用.本篇将说明该框架的原理及代码实现. 整体结构 UI与后台类绑定主要分为UI输入->后台属性,后台属性-UI更新两部分,为 ...
- iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解
一.概要:前一篇初步的描述了size class的概念,那么实际中如何使用呢,下面两个问题是我们一定会遇到的: 1.Xcode6中增加了size class,在storyboard中如何使用? 2.a ...
随机推荐
- 任务06——封装与单元测试(Markdown版)
模块代码地址 Core 模块代码地址 单元测试代码地址 两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起git了. 封装阶段 public class Core { public sta ...
- Linux下源码安装redis,编译安装
1.下载redis源码 [root@localhost opt]# wget http://download.redis.io/releases/redis-4.0.10.tar.gz 2.解压缩 [ ...
- 《Python机器学习》笔记(六)
模型评估与参数调优实战 基于流水线的工作流 一个方便使用的工具:scikit-learn中的Pipline类.它使得我们可以拟合出包含任意多个处理步骤的模型,并将模型用于新数据的预测. 加载威斯康星乳 ...
- MCU与FPGA通信
1.MCU启动FPGA相应功能模块 通过译码器选择相应的功能模块,调用实现功能. 2.MCU与FPGA串口通信 SPI协议简单.可靠.易实现,速度快,推荐使用SPI.SPI为四线机制,包含MOSI.M ...
- equal?, == and eql?, ===,
1.BasicObject中定义了 == 和equal?这两个方法,两个方法等价,用来比较两个对象是否是同一个对象,是的话结果就为true. 既然两者相同,为何要定义两个呢?只是为了再命名一个别名吗? ...
- python之网络socket编程
一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...
- 每天一个Linux命令(46)ifconfig命令
在windows系统中,ipconfig命令行工具被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config). ( ...
- Python编程-网络编程
一.Socket复习 1.Socket参数 sk.bind(address) 必会 s.bind(address) 将套接字绑定到地址.address地址的格式取决于地址族.在AF_INET下,以元组 ...
- python之json模块的基本使用
json模块的作用:将字符串和字典相互转换 json和eval的区别: eval函数不能识别null转换成None json可以将null转换成python可以识别的None json序列化和反序列化 ...
- HISAT2的运用
功能: 用于有参考基因组存在的比对工具(适用于whole-genome, transcriptome, and exome sequencing data) 用法: hisat2-build [opt ...