UI框架——奇怪的大冒險

框架思路:

1.創(chuàng)建一個綜合管理類(UIManager)來管理全部的界面操作 設置單例

2.創(chuàng)建一個基類UIBase(界面管理)來設置界面在顯示與隱藏時候的狀態(tài)

3.每一個界面單獨的腳本都繼承于 界面管理類(UIBase)

4.有一個腳本 用來控制開始時顯示的界面

綜合管理類(UIManager)

1.需要設置一個單例 使本腳本中的方法可以被其他腳本調(diào)用

2.創(chuàng)建 ?一個用來存放游戲界面預設體的字典 徒像、一個存放所有界面腳本的字典悴晰、 一個存放界面的棧

預設體的字典 ?Dictionary<string , Gamobject> UIobjDict = new Dictionary<string , GameObject>();

腳本的字典? Dictionary <string , UIBaes>currentUIDict = new Dictionary<string , UIBase>();

界面顯示的棧:Stack<UIBase>UIStack = new Stack<UIBase>();

3.創(chuàng)建一個方法給預設體的字典加載預設體笛丙。

? ? 并且在腳本開始運行時就進行全部加載,所以需要在Awake()中調(diào)用加載的方法

? ? 這里需要提及的是:被加載的東西必須存放在 Resources 文件夾中才能會獲取到馅精,方法:Resources.Load<類型>(路徑)次慢;

public void AddUIperfabByName(string UIName)

{

if (UIobjDict.ContainsKey(UIName)){

return; ?//判斷是否已經(jīng)存在相同的預設體

}

GameObject UIobj = Resources.Load<GameObject>("Perfab"+"/"+UIName);//放在Perfab文件夾下所以我們需要去找到他

if(UIobj旁涤!=null){ UIobjDict.Add(UIName, UIobj); }

}

4.通過預設體來實例化這個物體,并獲取到這個物體上的UIBase(繼承UIBase的腳本)腳本

? ?我們需要通過對這個腳本的操作來操控游戲?qū)ο?/p>

public UIBase InstantiteUIByName(string UIName) ?//我們需要有返回UIBase所以我們給方法的返回值為UIBase

{

if (currentUIDict.ContainsKey(UIName)){

return currentUIDict[UIName]; ? //我們需要先進行判斷 如果存在則可以直接返回

}

//不存在 我們將預設體進行實例化 并獲取腳本

GameObject objPerfab = UIobjDict[UIName];//取出預設體

GameObject obj = GameObject.Instantiate(objPerfab);//根據(jù)預設體進行實例化

UIBase uibase = obj.GetComponent();

currentUIDict.Add(UIName, uibase);//保存游戲?qū)ο笊砩系腢IBase的腳本進currentUIDict字典

obj.name = UIName; ? ?

return uibase;

}?

5.根據(jù) 棧(后進先出) 的規(guī)律迫像,我們來寫使界面入棧(顯示) ?出棧(隱藏) 的方法

此方法中需要和UIBase中的代碼進行交互劈愚,所以可先看下方關于UIBase的代碼

因為是 棧 的特性,所以我們會用到關于 棧 的方法 :

Stack.Peek()獲得棧頂?shù)奈矬w ? ?Stack.Pop()獲得棧頂?shù)奈矬w并刪除 ? ?Stack.Push()將物體壓入棧頂

入棧:

將已經(jīng)在棧中的界面隱藏起來 以顯示新入棧的界面

public void PushUserInterface(string UIName)

{

if (UIStack.Count>0){ //判斷當前棧中是否有界面

UIBase oldUI = UIStack.Peek();

oldUI.UserInterfacePause(); //如果當前棧中有界面就要將他隱藏掉 調(diào)用UIBase中的隱藏方法

}

// 然后將新的界面壓入棧頂并將它顯示

UIBase newUI = InstantiteUIByName(UIName); ?//獲取新的界面

UIStack.Push(newUI); //壓入棧頂

newUI.UserInterfaceEnter(); //調(diào)用UIBase中的界面進入顯示方法

}


出棧:

將當前顯示的棧頂?shù)慕缑嫱顺鑫偶耍@示下一張將出現(xiàn)在棧頂?shù)慕缑?/p>

public void PopUserInterface()

{

UIBase oldUI = UIStack.Pop(); //獲得并刪除當前棧頂?shù)慕缑?br>

oldUI.UserInterfaceExit(); 調(diào)用UIBase中的方法使其退出

if (UIStack.Count>0){ ?//判斷當前棧中是否還有界面

UIBase newUI = UIStack.Peek();?

newUI.UserInterfaceResume();? //如果有則獲得它并調(diào)取UIBase中的方法讓他重新顯示

}

}

界面管理基類(UIBase)

通過UIBase來綜合的管理界面的 顯示菌羽、隱藏 方法,使界面可以得到統(tǒng)一的妥當?shù)奶幚?

將其方法在適當?shù)牡胤秸{(diào)用就可以操控物體的顯示與隱藏

我們需要注意: 將方法寫成 虛方法(Virtual) 因為這是一個基類需要被繼承(Override)

繼承它的腳本中需要 寫入當前是否顯示物體(gameObject.SetActive(false / true);)

如果調(diào)用的Canvas攝像機設置為相機渲染 那我們需要在Enter()方法中寫入:

GetComponent().worldCamera = Camera.main; //將渲染攝像機設置為當前的主攝像機

public virtual void UserInterfaceEnter(){} //當界面第一次進入的時候調(diào)用?

public virtual void UserInterfacePause(){} //當界面隱藏的時候調(diào)用

public virtual void UserInterfaceResume(){} //當界面重新顯示時調(diào)用

public virtual void UserInterfaceExit(){} ?//當界面退出是調(diào)用

游戲控制腳本:

只需要寫入一個開始時調(diào)用的界面就可以

UIManager.Instance.PushUserInterface("StartCanvas");? //表示顯示StartCanvas這個界面


總結(jié):

使用這種UI框架 可以更容易的理清 開發(fā)思路由缆,使我們在開發(fā)的時候更有調(diào)理

當代碼量多的時候也不容易錯亂注祖,容易維護與修改

即使所需要的UI界面很多 也可以統(tǒng)一的進行管理。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末均唉,一起剝皮案震驚了整個濱河市是晨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舔箭,老刑警劉巖罩缴,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡靴庆,警方通過查閱死者的電腦和手機时捌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炉抒,“玉大人奢讨,你說我怎么就攤上這事⊙姹。” “怎么了拿诸?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長塞茅。 經(jīng)常有香客問我亩码,道長,這世上最難降的妖魔是什么野瘦? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任描沟,我火速辦了婚禮,結(jié)果婚禮上鞭光,老公的妹妹穿的比我還像新娘吏廉。我一直安慰自己,他們只是感情好惰许,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布席覆。 她就那樣靜靜地躺著,像睡著了一般汹买。 火紅的嫁衣襯著肌膚如雪佩伤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天晦毙,我揣著相機與錄音生巡,去河邊找鬼。 笑死结序,一個胖子當著我的面吹牛障斋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徐鹤,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邀层!你這毒婦竟也來了返敬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寥院,失蹤者是張志新(化名)和其女友劉穎劲赠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡凛澎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年霹肝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塑煎。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡沫换,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出最铁,到底是詐尸還是另有隱情讯赏,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布冷尉,位于F島的核電站漱挎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雀哨。R本人自食惡果不足惜磕谅,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雾棺。 院中可真熱鬧膊夹,春花似錦、人聲如沸垢村。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘉栓。三九已至宏榕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侵佃,已是汗流浹背麻昼。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馋辈,地道東北人抚芦。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像迈螟,于是被迫代替她去往敵國和親叉抡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 學習與分享: 奇怪的大冒險簡單部分的UI框架分為三種: 一答毫、綜合管理類(UIManager)褥民; 1、先寫一個單例使...
    歆轍閱讀 274評論 0 0
  • 首先定義一個UIBase類,在UIBase中定義一些虛方法:例如用戶剛進入界面時候調(diào)用的方法,切換當前界面的方法,...
    怎么可以這么閱讀 434評論 0 1
  • 寫框架就相當與管理一個公司洗搂,如何能夠使公司正常運轉(zhuǎn)并且井井有條消返?在寫框架的時候载弄,可以以全局的眼光和思維思考問題,這...
    菊妙君嬌閱讀 3,231評論 0 0
  • 1. Java基礎部分 基礎部分的順序:基本語法撵颊,類相關的語法宇攻,內(nèi)部類的語法,繼承相關的語法倡勇,異常的語法逞刷,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 文/孟永輝 數(shù)字貨幣的出現(xiàn)從某種程度上說明以互聯(lián)網(wǎng)技術為主要驅(qū)動力的外部勢力正在深度影響并改變著當前業(yè)已形成的金融...
    孟永輝閱讀 581評論 2 4