天天看點

基于 Unity 中的 NGUI 插件,通用的 UI 如何設計

以我的項目經曆來說,要保證通用性必須厘清需求是架構需要還是項目需要。舉一個例子,所有的項目都需要一個彈窗提示的接口,但是不同項目彈窗都不一樣,當時做的時候我沒有想好怎麼分離,那就放到項目類庫裡,保證架構不受影響,以後再重構。

下面根據題主提的要點針對性說下方案(以NGUI架構為基礎,UGUI還在研究中):

UI 和場景中物體的互動如何控制

目前遇到的場景中互動有幾種:

類似血條的顯示:通過錄影機轉換坐标的方法轉換為UI坐标來同步血條位置。

對點選等操作的響應:屬于控制管理器,不應該放在UI架構中,但是UI架構需要提供UI尺寸和實際尺寸的比例便于規劃控制範圍。

3D物體的展示:可以直接放在界面中也可以使用renderTexture,前者更友善。

切換場景時對 UI 如何處理

雖然unity提供了Scene這個功能給我們使用,但是我個人的最終目标是将整個遊戲運作在一個場景中,但這并不影響UI架構。一個場景一個單例的管理器(M2),還有一個跨場景的管理器(M1),M2負責具體的建立和關閉,M1負責對象池之類的功能。如果多場景,場景切換時M2執行個體和界面就都銷毀了,不需要特别處理;如果單場景,建立和銷毀都已經由M2執行個體負責了。

UI 如何分組/分類以友善管理

個人看來這一條本身提的比較模糊,因為可以了解為資源的管理也可以了解為結構的管理,下面分别回答。

資源管理:小的項目可以使用公用圖集(+Texture)的方式,大的項目UI資源太多,隻靠公用圖集肯定會造成記憶體的嚴重占用,是以建議是公用圖集+功能圖集(+Texture)。功能圖集就是一個功能子產品的公用圖集,在功能操作完畢時就可以釋放掉了。這裡涉及到的細節太多,就不展開了。

結構管理:我的思路是分為三類:1控件,就是button、label、sprite等等。(像buttonGroup就是button的組合,使用代碼建立和控制)2彈窗/界面/清單項,這三者都由控件組成。3共用布局,這一類是為了節省時間而分的,比方說卡牌遊戲中反複出現的卡牌布局其實就是共用布局,每個界面重複制作顯然浪費,是否有這類關鍵在于UE結構是否明确和複雜布局的複用程度。

如何統一管理 UI 的深度

這條可以引申為Z坐标(如果UI中有3D物體或者UI本身就是3D的)、renderQueue、界面的調用順序等全局屬性的管理。這些内容都應該在界面制作的時候就記錄在界面資訊上,在建立、聚/失焦、關閉界面時記錄在管理器中。

UI本身的深度其實很好管理,麻煩在UI上可能會有3D物體和特效,不同的shader可能會導緻不同的問題。

打開、關閉時的動效,以及被遮擋時的動效

動效本身其實更應該當作項目需求而不是架構需求。首先建議有單獨的動效管理器,其次如果​​ 規劃中對動效規劃不明确,可以放在具體實作中。

如果項目中沒有靠譜的UE設計,架構做得越多其實越累。引用程式界的質能公式:error=(more code)^{2}

繼續閱讀