今天的主要任务是完善NormalPanel, 搭建PopupPanel。

在编写PanelManager的过程中,发现了一个bug。昨天把panelPath直接传给了ResourceManager.GetInstance().LoadAsset<GameObject>(path);

今天做了修改,并且添加了初始化dictPanelPath的方法,为此在SysDefine新添加了一个类,PanelNameStr。在Helper类里添加了以一个方法GetPathByName。

部分修改代码如下,偷了个懒,直接全部复制粘贴了:

PanelManager.cs

 /*
2018.12.30修改记录:1.增加了SetDictPanelPath()方法
2.修改了CreatePanel()方法
3.增加了DestroyPanel()方法
*/
using System.Collections.Generic;
using UnityEngine;
public class PanelManager
{
//本类实例
private static PanelManager _instance;
//存储面板名字和对应的路径字典
public static Dictionary<string, string> dictPanelPath;
//存储已显示的面板字典
public static Dictionary<string, BasePanel> dictCurPanel;
//存储已隐藏的面板字典
public static Dictionary<string, BasePanel> dictHidePanel;
//存储Popup类型面板的字典
public static Dictionary<string, Stack<BasePanel>> dictPopupPanel; //单例模式
private PanelManager() { }
public static PanelManager GetInstance()
{
if(_instance == null)
{
_instance = new PanelManager(); InitProperties();
SetDictPanelPath();
}
return _instance;
}
//初始化字段
private static void InitProperties()
{
dictPanelPath = new Dictionary<string, string>();
dictCurPanel = new Dictionary<string, BasePanel>();
dictHidePanel = new Dictionary<string, BasePanel>();
dictPopupPanel = new Dictionary<string, Stack<BasePanel>>();
}
private static void SetDictPanelPath()
{
dictPanelPath.Add(PanelNameStr.LogOnPanel, PrefabPathStr.logOnPanelPath);
dictPanelPath.Add(PanelNameStr.RegisterPanel, PrefabPathStr.registerPanelPath);
}
/// <summary>
/// 创建一个面板
/// 先检查dictHidePanel集合里是否存在此面板,有则取出,显示,并加入dictCurPanel集合
/// 没有,则创建一个,然后加如dictCurPanel集合。
/// </summary>
/// <param name="panelName">要创建的面板的名字</param>
/// <returns></returns>
public BasePanel CreatePanel(string panelName)
{
BasePanel basePanel = null;
dictHidePanel.TryGetValue(panelName, out basePanel);
if(basePanel != null)
{
basePanel.Open();
//添加到正在显示的面板集合
dictCurPanel.Add(panelName, basePanel);
return basePanel;
}
else
{ string path = Helper.GetInstance().GetPathByName(panelName); //根据存储路径,加载预制体
GameObject go = ResourceManager.GetInstance().LoadAsset<GameObject>(path);
if(go != null)
{
basePanel = go.GetComponent<BasePanel>();
if(basePanel != null)
{
//添加到正在显示的面板集合
dictCurPanel.Add(panelName, basePanel);
}
else
{
Debug.LogError(GetType()+"你可能忘记挂载了BasePanel类型的脚本");
}
return basePanel;
}
else
{
Debug.Log(GetType()+"请检查配置文件,预制体不存在"); }
}
return null;
} /// <summary>
/// 1.从dictCurPanel集合中取出对应的面板
/// 2.隐藏
/// 3.加入dictHidePanel集合
/// </summary>
/// <param name="PanelName"></param>
public void DestroyPanel(string panelName)
{
BasePanel basePanel = null;
basePanel = dictCurPanel[panelName];
if(basePanel == null)
{
Debug.LogError(GetType()+"面板不存在,请检查配置文件");
return;
}
else
{
//关闭面板
basePanel.Close();
//加入dictHidePanel集合
dictHidePanel.Add(panelName, basePanel);
}
} }

为了测试DestroyPanel,新建了一个面板RegisterPanel。

在LogOnPanel.cs类里测试

 using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class LogOnPanel : BasePanel
{
private void Awake()
{
this.panelType = EPanelType.Normal;
} public void OnStartGameBtnClick()
{
//TO DO
}
//测试DestroyPanel()方法
public void OnRegisterBtnClick()
{
//隐藏自身
PanelManager.GetInstance().DestroyPanel(PanelNameStr.LogOnPanel);
//显示注册面板
PanelManager.GetInstance().CreatePanel(PanelNameStr.RegisterPanel);
} }

另外在设计过程中和最初的想法有些出入,本来打算用工厂方法模式成产各种类型的Panel,现在类型已经在Awake方法里注册了,而且也不麻烦,所以把NormalPanel.cs,PopupPanel.cs,HideOtherPanel.cs删除了,我要去学习Shader了,下午继续更PopupPanel的搭建。

就在我光顾“五谷轮回之所”的时候想到我的代码还有一个严重的Bug,对象池技术中有生有死,有死有生,相互转化。而我的代码做了形式上的转化,却没有做内存处理。当从隐藏面板集合中取出一个面板显示的时候,就是由死转化到生,需要做两个处理,一是从dictHidePanel中移除这个键值对,而是向dictCurPanel中加入这个键值对。同理,当从当前显示面板中取出一个面板隐藏时,就是由生到死,也需要做对应的两个处理。修改代码如下:

  //添加到正在显示的面板集合
dictCurPanel.Add(panelName, basePanel);
//从dictHidePanel集合中移除
dictHidePanel.Remove(panelName);

这是CreatePane()方法中修改的代码。

 //从dictCurPanel集合中移除
dictCurPanel.Remove(panelName);
//加入dictHidePanel集合
dictHidePanel.Add(panelName, basePanel);

这是DestroyPanel()方法中修改的代码。

UI框架搭建DAY2的更多相关文章

  1. Element UI 框架搭建

    Element UI 框架搭建 1.webpack 全局安装 npm install -g webpack 2.淘宝镜像cnpm安装 npm install -g cnpm --registry=ht ...

  2. UI框架搭建DAY1

    分析:UI框架主要是为了用户(使用框架的程序猿)更快捷.方便地开发UI,UI框架的好处还在于解耦,使得程序更具有灵活性. UI框架的核心是窗口的管理,窗口管理的主要任务就是显示窗口和关闭窗口. 因为窗 ...

  3. ASP.NET MVC搭建项目后台UI框架—1、后台主框架

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  4. ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...

  5. 从零开始,搭建博客系统MVC5+EF6搭建框架(4)上,前后台页面布局页面实现,介绍使用的UI框架以及JS组件

    一.博客系统进度回顾以及页面设计 1.1页面设计说明 紧接前面基础基本完成了框架搭建,现在开始设计页面,前台页面设计我是模仿我博客园的风格来设计的,后台是常规的左右布局风格. 1.2前台页面风格 主页 ...

  6. ASP.NET MVC搭建项目后台UI框架—2、菜单特效

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  7. ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  8. ASP.NET MVC搭建项目后台UI框架—4、tab多页签支持

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  9. ASP.NET MVC搭建项目后台UI框架—5、Demo演示Controller和View的交互

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

随机推荐

  1. C#WebService服务在Windows7的部署

    (一)C#WebService服务在Windows7的部署  一.在控制面板,程序与卸载中安装IIS组件. 二.IIS无法显示WebService的.asmx文件.解决办法:注:(这里可以不用考虑,直 ...

  2. java使用代理请求https

    我本来在我本机写的代码,本机电脑是可以连外网没限制,对于https和http都可以.但是放在linux服务器上后,因为VM限制了不能访问外网,而且有ssl验证所以就一直报错,要么是连不上线上请求,要么 ...

  3. Gephi学习笔记

    使用gephi对图数据进行可视化操作,下面网址是gephi的说明文档 https://seinecle.github.io/gephi-tutorials/generated-pdf/semantic ...

  4. laravel5.8笔记四:中间件

    应用场景:检测登陆,控制器加载数据,传递常量 命令 //中间件创建命令 php artisan make:middleware Check 注意: 1.需要注册中间件 2.中间件命名不能重复   mi ...

  5. 新书出版 |《Oracle程序员面试笔试宝典》

    新书出版 |<Oracle程序员面试笔试宝典> <Oracle程序员面试笔试宝典> 丛书[数据库 面试 笔试宝典]已在京东.淘宝和天猫预售,一共 5 本,目前市场上已有4本,丛 ...

  6. MTK NTP和NITZ更新时间的问题

    NITZ(Network Identity and Time Zone,网络标识和时区),是一种用于自动配置本地的时间和日期的机制,同时也通过无线网向移动设备提供运营商信息.NITZ是自从PHASE ...

  7. Win2008R2+Apache+PHP+Tomcat配置

    一.VC运行库 对于Apache和PHP,在Windows上运行的话都需要对应VC运行库的支持,即Apache.PHP和VC运行库这三者的版本必须相对应,这就会带来很多问题,比如下了较新的Apache ...

  8. Spring framewrok 源码概览

    关于Spring 框架阅读记录 关于SpringMvc 框架阅读记录 1.首先看一个 spring-web 项目 项目结构 http 包 主要存储 http 相关信息 HttpRequst,HttpS ...

  9. 24、设计模式、webpack

    利用静态属性:长驻内存 (一) 单例模式 概念:单个实例,只有一个对象,多次创建,返回同一个对象. 单例模式的核心:==确保只有一个实例==,并提供全局访问. //利用了静态属性:长驻内存 funct ...

  10. 15:CSS3 3D

    15:CSS3 3D 什么是3d的场景呢? 2d场景,在屏幕上水平和垂直的交叉线x轴和y轴 3d场景,在垂直于屏幕的方法,相对于3d多出个z轴 Z轴:靠近屏幕的方向是正向,远离屏幕的方向是反向 CSS ...