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


    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(一个面板对应一个枚举成员):

     1 using UnityEngine;
     2 using System.Collections;
     3 using System;
     4 
     5 
     6 public enum UIPanelType  {
     7     ItemMessage,
     8     Knapsack,
     9     MainMenu,
    10     Shop,
    11     Skill,
    12     System,
    13     Task
    14 }

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

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

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

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

        

     1 using UnityEngine;
     2 using System.Collections;
     3 using System;
     4 //序列化:把内存上的东西放在硬盘上成为文本文件,命名空间using System;
     5 //ISerializationCallbackReceiver:接口,实现OnAfterDeserialize OnBeforeSerialize两个方法,与JsonUtility相对应,是其扩展自定义的内容
     6 [Serializable]
     7 public class UIPanelInfo :ISerializationCallbackReceiver {
     8     [NonSerialized]
     9     //注意要跟json脚本里面的类型对应,否则无法解析,json文件就相当于UIPanelInfo类型数组
    10     public UIPanelType panelType;//不能解析该类型,因此让其不序列化和反序列化
    11     public string panelTypeString;
    12     //{
    13     //    get //进行序列化
    14     //    {
    15     //        return panelType.ToString();
    16     //    }
    17     //    set//进行反序列化
    18     //    {
    19     //        UIPanelType type =(UIPanelType)System.Enum.Parse(typeof(UIPanelType), value);//写在这时候不会调用这个方法
    20     //        panelType = type;
    21     //    }
    22     //}
    23     public string path;
    24     
    25     // 反序列化成功会调用该方法   反序列化:从文本信息 到对象的过程 相当于set方法
    26     public void OnAfterDeserialize()
    27     {
    28         UIPanelType type = (UIPanelType)System.Enum.Parse(typeof(UIPanelType), panelTypeString);//把字符串转换成枚举类型,枚举类型无法使用as,只能强转
    29         panelType = type;
    30     }
    31     //在序列化之前调用 相当于get方法
    32     public void OnBeforeSerialize()
    33     {
    34         
    35     }
    36 }

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

     

     1 using UnityEngine;
     2 using System.Collections;
     3 using System.Collections.Generic;
     4 using System;
     5 
     6 public class UIManager {
     7  private Dictionary<UIPanelType, string> panelPathDict;//存储所有面板Prefab的路径
     8  [Serializable]
     9     //UIPanelInfo类,json脚本整体对应的一个类,即解析json脚本得到就是这个类的对象
    10     class UIPanelTypeJson
    11     {
    12         public List<UIPanelInfo> infoList;
    13     }
    14     private void ParseUIPanelTypeJson()
    15     {
    16         panelPathDict = new Dictionary<UIPanelType, string>();
    17 
    18         TextAsset ta = Resources.Load<TextAsset>("UIPanelType");//加载进来就是TextAsset类型
    19 
    20         UIPanelTypeJson jsonObject = JsonUtility.FromJson<UIPanelTypeJson>(ta.text);//注意<>里面一定要传类,//会调用反序列化 序列化方法
    21 
    22         foreach (UIPanelInfo info in jsonObject.infoList) 
    23         {
    24             //Debug.Log(info.panelType);
    25             panelPathDict.Add(info.panelType, info.path);//字典方便用类型找到路径
    26         }
    27     }
    28 }
  • 相关阅读:
    apache重写规则自动追加查询参数QSA
    错误代码2104:无法下载Silverlight应用程序。请查看Web服务器设置
    eclipse的shell相关插件
    二叉树及排序二叉树的相关操作汇总
    约瑟夫环
    c++ 输入一行字符串
    类对象做函数参数(传值和传引用)
    运算符重载(=和+)
    char型字符串(数组)与string型字符串 指针与引用
    一维和二维数组 动态内存分配
  • 原文地址:https://www.cnblogs.com/dsh20134584/p/7338671.html
Copyright © 2020-2023  润新知