這篇文章是博主早年寫的,當初年少不懂事,居然取這個標題,那時候的我徹底沒能力寫好UI框架。html
如今樓主已經轉行去當廚師了,各位看官很是抱歉了,浪費大家時間點進來。git
爲何要使用UI框架?直接使用NGUI或UGUI一拖一拉直接搭載出界面不就好了?github
我相信不少小白,包括我在剛學習Unity3D UI的時候都這樣想過。框架
個人第一款款Unity2D遊戲《山地賽車》,使用的就是NGUI搭載界面。函數
弱聯網手遊通常都沒什麼複雜的界面,我也是很輕鬆花一天就把界面搭載好了,看起來好挺好看的,還花了很多時間作動態效果。學習
界面搭載好後,開始開發遊戲內容,這下問題開始來了:ui
1.如何實現界面間的溝通?例如點擊返回按鈕,返回上一個界面,點擊揹包系統,彈出揹包。spa
2.如何實現界面與遊戲數據的溝通?例如點擊排行榜,能列出最新的排名,點擊購買車輛,能扣錢並買入新的車輛。設計
一開始個人作法(我相信也是大部分新手最喜歡的作法)就是爲每一個要觸發功能的UI添加一個腳本,而後添加一個public gameobject,htm
而後拖入觸發UI時要控制的object。在腳本的OnClick等函數裏實現邏輯功能。
這樣作是挺容易。很快我也花了半天時間拖來拖去,把UI要關聯的各類物件綁定好。
可是接下來的各類問題讓我很是頭疼:
1.隨着遊戲系統的複雜,UI控件愈來愈多,各個UI直接的通信,以及UI與GameObject之間的通信造成一張複雜的蜘蛛網,
拖着拖着,有時候我都忘了哪一個對象跟哪一個對象關聯了。若是是別人要看個人程序,我估計他找半天都找不到UI邏輯的入口。
2.耦合性很是嚴重,若是要改變需求,更改某個UI或者更改某個遊戲對象,那麼你須要再手動所有與該對象關聯的物件從新更改一次。
3.做爲強迫症的我,最受不了程序代碼的混亂。這種組織方式十分「不優雅」,看着很亂。
鑑於以上各類狀況,我開始尋找一種新的,科學的,高效的UI管理方式,
最開始想到的就是大名鼎鼎的MVC模式,我想過用它來管理個人UI,不過因爲我對MVC模式不是很熟悉,嘗試了下,效果並非很好。
在網上搜到幾個不錯的UI框架,都寫得很不錯,各位能夠參考參考:
1.Unity-UI-Framework的設計與實現 By:王選易 Github
2.簡單、強大的TTUIFramework By:chiuan 遊戲蠻牛 (這位的設計思路是參考上面那位做者的)
3.【設計和開發一套自動化UI框架】 By:NPC燕 遊戲蠻牛
他們的設計思路都很清晰,作出來的效果也都很強大,都是些遊戲界的大牛,可是都有點複雜。
做爲一名菜鳥,我固然要設計出只有菜鳥能看得懂的東西啦。
好了,廢話很少說,如下是我設計的兩個主要方向:
1.設計一套用於管理UI的框架,各個UI的生成,銷燬,切換,都是經過這個Manager單例來實現。各個UI間不直接聯繫。
2.全部UI都基於一個UIBase基類,每一個UI的預設對應一個UIBase子類腳本,UI的基本邏輯在該類中實現,例如:_MenuView.prefab 對應 _MenuView.cs
3.從新實現Unity3D的消息通信,原有SendMessage效率較低,利用訂閱-發佈(即觀察者模式)從新設計一套通信中心,全部UI間的通信,
以及UI和遊戲層的通信,皆間接經過MessageCenter來管理。實現解耦。
4.以棧發方式管理UI,每次打開一個新的UI,都將它堆入棧,關閉時出棧。這個棧是一個特殊的棧,例如它能夠實現,某個不在棧頂的UI,能夠「TOP」到棧頂。
未完待續。。。