01.概念:管理场景中所有的面板,控制面板之间的跳转

02.项目层级目录:

Resources:存放UIPanel,习惯把所有的一个个面板做成预制源,使用时加载

Scenes:存放场景

UIFrameWork:单独的文件,存放UI框架的文件夹,方便以后导出给别的项目使用

架构图:

03.设计主菜单(将所有的面板设置为prefab)

canvas scales中UI scale model设置为 Constane Pixel Size表示窗口像素大小与实际运行的界面像素一样,但是UI组件比如Text不会改变(字体固定的)。

scale with screen size:随着屏幕的大小变化,所有的UI组件都会改变,分为根据高度与宽度适配,高度适配就是ui随着高度的变化而变化,宽度变化是不会影响UI的,设置match属性。

设置UI时按住shift:等比例缩放,ctrl:中心缩放

04.框架开发之保存面板信息(通过json和枚举)

层级结构:

首先创建面板枚举类UIPanelType(一个面板对应一个枚举成员):

 using UnityEngine;
using System.Collections;
using System; public enum UIPanelType {
ItemMessage,
Knapsack,
MainMenu,
Shop,
Skill,
System,
Task
}

创建文本文件,保存面板的类型和路径(这样面板只要放在Resources文件夹下,路径保存好可以随意放,写完一个Json文档后可以百度Json校验检查是否正确:http://www.json.cn/):

注意:因为用JsonUtility解析json文件,不是别数组的格式,要把数组包装成一个对象就是外面加{}。同时在VS编辑json文件一般会保存成以前的目录(如果你一直没有移动不会有问题,比如这个项目移动到了resource文件夹下,但是还是会保存在它初始创建的文件夹,这样识别的还是前面的文件,还是会有同样的错误)。

解析Json文件得到面板路径:

首先创建json脚本对应的类UIPanelInfo:

 using UnityEngine;
using System.Collections;
using System;
//序列化:把内存上的东西放在硬盘上成为文本文件,命名空间using System;
//ISerializationCallbackReceiver:接口,实现OnAfterDeserialize OnBeforeSerialize两个方法,与JsonUtility相对应,是其扩展自定义的内容
[Serializable]
public class UIPanelInfo :ISerializationCallbackReceiver {
[NonSerialized]
//注意要跟json脚本里面的类型对应,否则无法解析,json文件就相当于UIPanelInfo类型数组
public UIPanelType panelType;//不能解析该类型,因此让其不序列化和反序列化
public string panelTypeString;
//{
// get //进行序列化
// {
// return panelType.ToString();
// }
// set//进行反序列化
// {
// UIPanelType type =(UIPanelType)System.Enum.Parse(typeof(UIPanelType), value);//写在这时候不会调用这个方法
// panelType = type;
// }
//}
public string path; // 反序列化成功会调用该方法 反序列化:从文本信息 到对象的过程 相当于set方法
public void OnAfterDeserialize()
{
UIPanelType type = (UIPanelType)System.Enum.Parse(typeof(UIPanelType), panelTypeString);//把字符串转换成枚举类型,枚举类型无法使用as,只能强转
panelType = type;
}
//在序列化之前调用 相当于get方法
public void OnBeforeSerialize()
{ }
}

建立UIManager脚本读取面板类型和信息:

 using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System; public class UIManager {
private Dictionary<UIPanelType, string> panelPathDict;//存储所有面板Prefab的路径
[Serializable]
//UIPanelInfo类,json脚本整体对应的一个类,即解析json脚本得到就是这个类的对象
class UIPanelTypeJson
{
public List<UIPanelInfo> infoList;
}
private void ParseUIPanelTypeJson()
{
panelPathDict = new Dictionary<UIPanelType, string>(); TextAsset ta = Resources.Load<TextAsset>("UIPanelType");//加载进来就是TextAsset类型 UIPanelTypeJson jsonObject = JsonUtility.FromJson<UIPanelTypeJson>(ta.text);//注意<>里面一定要传类,//会调用反序列化 序列化方法 foreach (UIPanelInfo info in jsonObject.infoList)
{
//Debug.Log(info.panelType);
panelPathDict.Add(info.panelType, info.path);//字典方便用类型找到路径
}
}
}

UI(UGUI)框架(一)---------概述与保存/读取面板类型与路径的更多相关文章

  1. UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类

    UIManage单实例: /// 单例模式的核心 /// 1,定义一个静态的对象 在外界访问 在内部构造 /// 2,构造方法私有化 private static UIManager _instanc ...

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

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

  3. Java I/O框架 - 总结概述

    总结 以下需要重点掌握: 字节流,以下读取结束全部返回-1 字节节点流-访问文件 FileInputStream/FileOutputStream 可以读取任意文件 可以复制图片 读取字符String ...

  4. UI自动化测试框架(项目实战)python、Selenium(日志、邮件、pageobject)

    其实百度UI自动化测试框架,会出来很多相关的信息,不过就没有找到纯项目的,无法拿来使用的:所以我最近就写了一个简单,不过可以拿来在真正项目中可以使用的测试框架. 项目的地址:https://githu ...

  5. 数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

    UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程.以下是我之前写的一个自动化测试的小Demo.这个Demo基于Selenium与Java.由于现在Selenium在自动化测 ...

  6. 记录项目代码迁移后,UI测试框架的搭建(配置文件的修改、测试脚本试运行)

    前文:记录一次项目代码迁移过程 上文代码迁移的目的就是为了新增vue脚手架自带的UI测试框架,工具有了,就需要实践运行在项目中了(修改配置文件.编写测试脚本等). 一.单元测试 测试框架 karma ...

  7. 简单Web UI 自动化测试框架 pyse

    WebUI automation testing framework based on Selenium and unittest. 基于 selenium 和 unittest 的 Web UI自动 ...

  8. [ASP.NET Core 3框架揭秘] 配置[1]:读取配置数据[上篇]

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立即浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...

  9. Spring 框架的概述以及Spring中基于XML的IOC配置

    Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...

随机推荐

  1. JLable设置复制粘贴

    final JLabel keyLable = new JLabel(key); keyLable.addMouseListener(new MouseAdapter() { @Override pu ...

  2. java读取本地文件

    File file = new File("F:/hejing/InstrumentJsonData.txt");        StringBuilder localStrBul ...

  3. 斯坦福大学Andrew Ng - 机器学习笔记(7) -- 异常检测

    大概用了一个月,Andrew Ng老师的机器学习视频断断续续看完了,以下是个人学习笔记,入门级别,权当总结.笔记难免有遗漏和误解,欢迎讨论. 鸣谢:中国海洋大学黄海广博士提供课程视频和个人笔记,在此深 ...

  4. struts2+Oracle实现管理员查看用户提交的意见功能

    说一下需求:这个功能类似于邮件功能,当用户在站点中提交一些建议及意见后.后台将其存入到Oracle数据库中.然后管理员登录站点,会看到还没有读过以及读过的意见及建议,并能够将未读过的意见及建议标记为已 ...

  5. opencv3计算机视觉+Python(四)

    使用分水岭和GrabCut算法进行物体分割 用GrabCut算法进行图像分割 在OpenCV中,实现了grabcut分割算法,该算法可以方便的分割出前景图像,操作简单,而且分割的效果很好.算法的原理参 ...

  6. hadoop学习第七天-HBase的原理、安装、shell命令

    一. hbase的原理知识 1. hbase介绍 hbase是hadoop的一个重要成员,主要用于存储结构化数据,构建在hdfs之上的分布式存储系统,它主要通过横向扩展,通用不断增加廉价服务器增加计算 ...

  7. 安卓手机开机键失灵,FASTBOOT模式ADB重启

    安装ADB工具 CMD指令fastboot reboot

  8. Eclipse部署项目的时候抛异常【Multiple Contexts have a path of "/cdcpm".】

    Eclipse部署项目的时候抛异常[Multiple Contexts have a path of "/cdcpm".]重新clean .删除server都不好使.查看一下tom ...

  9. docker多个容器连接 将 Rails 程序部署到 Docker 容器中

    在docker中使用MySQL数据库 https://yq.aliyun.com/articles/583765 将 Rails 程序部署到 Docker 容器中

  10. css系列(4)简介

        本节用来简单介绍css.     (1)css: CSS 指层叠样式表 (Cascading Style Sheets): 功能以及作用:1.样式定义如何显示 HTML 元素; 2.样式通常存 ...