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面板的实例化/开发字典扩展类的更多相关文章

  1. UI(UGUI)框架(一)---------概述与保存/读取面板类型与路径

    01.概念:管理场景中所有的面板,控制面板之间的跳转 02.项目层级目录: Resources:存放UIPanel,习惯把所有的一个个面板做成预制源,使用时加载 Scenes:存放场景 UIFrame ...

  2. Android 开发工具类 10_Toast 统一管理类

    Toast 统一管理类: 1.短时间显示Toast: 2.长时间显示 Toast: 3.自定义显示 Toast 时间. import android.content.Context; import a ...

  3. Android 开发工具类 05_Logcat 统一管理类

    Logcat 统一管理类: 1.默 认tag 的函数: 2.自定义 tag 的函数. import android.util.Log; // Logcat 统一管理类 public class L { ...

  4. 基于Python3 + appium的Ui自动化测试框架

    UiAutoTest 一.概要 数据驱动的Ui自动化框架 二.环境要求 框架基于Python3 + unittest + appium 运行电脑需配置adb.aapt的环境变量,build_tools ...

  5. 《C#微信开发系列(2)-自定义菜单管理》

    2.0自定义菜单管理 ①接口说明 微信服务号聊天窗口下面的菜单项(有的公众号有启用有的则没有),这个可以在编辑模式简单配置,也可以在开发模式代码配置.微信公众平台开发者文档:微信公众号开发平台创建自定 ...

  6. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  7. web前端开发常用的10个高端CSS UI开源框架

    web前端开发常用的10个高端CSS UI开源框架   随着人们对体验的极致追求,web页面设计也面临着新的挑战,不仅需要更人性化的设计理念,还需要设计出更酷炫的页面.作为web前端开发人员,运用开源 ...

  8. 分享一个UI与业务逻辑分层的框架(二)

    序言 第一篇讲解了UI与业务逻辑分层的框架(UIMediator)的使用.本篇将说明该框架的原理及代码实现. 整体结构 UI与后台类绑定主要分为UI输入->后台属性,后台属性-UI更新两部分,为 ...

  9. iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解

    一.概要:前一篇初步的描述了size class的概念,那么实际中如何使用呢,下面两个问题是我们一定会遇到的: 1.Xcode6中增加了size class,在storyboard中如何使用? 2.a ...

随机推荐

  1. Python3.6全栈开发实例[012]

    12.输出商品列表,用户输入序号,显示用户选中的商品(升级题) 商品列表: goods = [{"name": "电脑", "price": ...

  2. jQuery 查找标签

    1 基本选择器 2 基本筛选器 3 属性选择器 4 间接选择 1 基本选择器 //id选择器: $("#id") //标签选择器: $("tagName") / ...

  3. nodejs koa2 获取get值和post值,提交表单

    // 获取get值 router.get('/b', async(ctx, next) => { ctx.state = { title: 'Koa2', name: '小明-list' } l ...

  4. vue 项目 npm install 报错解决

    node-sass 安装报错解决办法 2017年04月15日 14:34:25 阅读数:20189 E:\kibana>npm install node-sass > node-sass@ ...

  5. springMVC文件的上传与下载

    1.文件上传 springmvc中只需要配置上传组件,然后配合使用MultipartFile,就可以轻松实现单个文件上传和批量上传,而且上传的文件类型和大小都可以在springmvc 配置文件中配置. ...

  6. 剑指offer 面试11题

    面试11题: 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4 ...

  7. 做测试时,启动SpringBoot出现警告,在ClassPath中一个类多次出现

    Found multiple occurrences of org.json.JSONObject on the class path: jar:file:/C:/Users/niaomingjian ...

  8. knockout注释标签----逻辑判断(学习笔记,欢迎拍砖)

    使用knockout绑定数据时,需要进行判断处理 <!-- ko if:$root.ifHaveVideo($data) --> 这里不是被注释掉的代码 是逻辑判断代码 有效的 <d ...

  9. 【转】Linux查看物理CPU个数、核数、逻辑CPU个数

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数cat /proc/cpuinfo| g ...

  10. iOS URL Loading System / HTTP 重定向 认识与学习

    一个朋友问了我一个问题,需求是这样的:他要用本地的H5资源 替换 链接资源,  但是判断链接资源时候 因为一些操作请求本地化了之后  一些操作比如请求服务器使用的是http开头,然而本地资源一直是以f ...