UI(UGUI)框架(一)---------概述与保存/读取面板类型与路径
01.概念:管理場景中所有的面板,控制面板之間的跳轉(zhuǎn)
02.項目層級目錄:
Resources:存放UIPanel,習(xí)慣把所有的一個個面板做成預(yù)制源,使用時加載
Scenes:存放場景
UIFrameWork:單獨的文件,存放UI框架的文件夾,方便以后導(dǎo)出給別的項目使用
?
架構(gòu)圖:
?
?
?
03.設(shè)計主菜單(將所有的面板設(shè)置為prefab)
canvas scales中UI scale model設(shè)置為 Constane Pixel Size表示窗口像素大小與實際運行的界面像素一樣,但是UI組件比如Text不會改變(字體固定的)。
scale with screen size:隨著屏幕的大小變化,所有的UI組件都會改變,分為根據(jù)高度與寬度適配,高度適配就是ui隨著高度的變化而變化,寬度變化是不會影響UI的,設(shè)置match屬性。
?
設(shè)置UI時按住shift:等比例縮放,ctrl:中心縮放
?
04.框架開發(fā)之保存面板信息(通過json和枚舉)
層級結(jié)構(gòu):
首先創(chuàng)建面板枚舉類UIPanelType(一個面板對應(yīng)一個枚舉成員):
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 }創(chuàng)建文本文件,保存面板的類型和路徑(這樣面板只要放在Resources文件夾下,路徑保存好可以隨意放,寫完一個Json文檔后可以百度Json校驗檢查是否正確:http://www.json.cn/):
注意:因為用JsonUtility解析json文件,不是別數(shù)組的格式,要把數(shù)組包裝成一個對象就是外面加{}。同時在VS編輯json文件一般會保存成以前的目錄(如果你一直沒有移動不會有問題,比如這個項目移動到了resource文件夾下,但是還是會保存在它初始創(chuàng)建的文件夾,這樣識別的還是前面的文件,還是會有同樣的錯誤)。
? 解析Json文件得到面板路徑:
? ? ?首先創(chuàng)建json腳本對應(yīng)的類UIPanelInfo:
? ??
1 using UnityEngine; 2 using System.Collections; 3 using System; 4 //序列化:把內(nèi)存上的東西放在硬盤上成為文本文件,命名空間using System; 5 //ISerializationCallbackReceiver:接口,實現(xiàn)OnAfterDeserialize OnBeforeSerialize兩個方法,與JsonUtility相對應(yīng),是其擴展自定義的內(nèi)容 6 [Serializable] 7 public class UIPanelInfo :ISerializationCallbackReceiver { 8 [NonSerialized] 9 //注意要跟json腳本里面的類型對應(yīng),否則無法解析,json文件就相當于UIPanelInfo類型數(shù)組 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);//寫在這時候不會調(diào)用這個方法 20 // panelType = type; 21 // } 22 //} 23 public string path; 24 25 // 反序列化成功會調(diào)用該方法 反序列化:從文本信息 到對象的過程 相當于set方法 26 public void OnAfterDeserialize() 27 { 28 UIPanelType type = (UIPanelType)System.Enum.Parse(typeof(UIPanelType), panelTypeString);//把字符串轉(zhuǎn)換成枚舉類型,枚舉類型無法使用as,只能強轉(zhuǎn) 29 panelType = type; 30 } 31 //在序列化之前調(diào)用 相當于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腳本整體對應(yīng)的一個類,即解析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);//注意<>里面一定要傳類,//會調(diào)用反序列化 序列化方法 21 22 foreach (UIPanelInfo info in jsonObject.infoList) 23 { 24 //Debug.Log(info.panelType); 25 panelPathDict.Add(info.panelType, info.path);//字典方便用類型找到路徑 26 } 27 } 28 }?
轉(zhuǎn)載于:https://www.cnblogs.com/dsh20134584/p/7338671.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的UI(UGUI)框架(一)---------概述与保存/读取面板类型与路径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 性能测试关注点整理总结
- 下一篇: 2017百度之星程序设计大赛 - 初赛(