基于 Unity 中的 NGUI 插件,通用的 UI 如何设计
以我的項(xiàng)目經(jīng)歷來說,要保證通用性必須分清需求是框架需要還是項(xiàng)目需要。舉一個例子,所有的項(xiàng)目都需要一個彈窗提示的接口,但是不同項(xiàng)目彈窗都不一樣,當(dāng)時做的時候我沒有想好怎么分離,那就放到項(xiàng)目類庫里,保證框架不受影響,以后再重構(gòu)。
下面根據(jù)題主提的要點(diǎn)針對性說下方案(以NGUI框架為基礎(chǔ),UGUI還在研究中):
UI 和場景中物體的交互如何控制
目前遇到的場景中交互有幾種:
類似血條的顯示:通過攝像機(jī)轉(zhuǎn)換坐標(biāo)的方法轉(zhuǎn)換為UI坐標(biāo)來同步血條位置。
對點(diǎn)擊等操作的響應(yīng):屬于控制管理器,不應(yīng)該放在UI框架中,但是UI框架需要提供UI尺寸和實(shí)際尺寸的比例便于規(guī)劃控制范圍。
3D物體的展示:可以直接放在界面中也可以使用renderTexture,前者更方便。
切換場景時對 UI 如何處理
雖然unity提供了Scene這個功能給我們使用,但是我個人的最終目標(biāo)是將整個游戲運(yùn)行在一個場景中,但這并不影響UI框架。一個場景一個單例的管理器(M2),還有一個跨場景的管理器(M1),M2負(fù)責(zé)具體的創(chuàng)建和關(guān)閉,M1負(fù)責(zé)對象池之類的功能。如果多場景,場景切換時M2實(shí)例和界面就都銷毀了,不需要特別處理;如果單場景,創(chuàng)建和銷毀都已經(jīng)由M2實(shí)例負(fù)責(zé)了。
UI 如何分組/分類以方便管理
個人看來這一條本身提的比較模糊,因?yàn)榭梢岳斫鉃橘Y源的管理也可以理解為結(jié)構(gòu)的管理,下面分別回答。
資源管理:小的項(xiàng)目可以使用公用圖集(+Texture)的方式,大的項(xiàng)目UI資源太多,只靠公用圖集肯定會造成內(nèi)存的嚴(yán)重占用,所以建議是公用圖集+功能圖集(+Texture)。功能圖集就是一個功能模塊的公用圖集,在功能操作完畢時就可以釋放掉了。這里涉及到的細(xì)節(jié)太多,就不展開了。
結(jié)構(gòu)管理:我的思路是分為三類:1控件,就是button、label、sprite等等。(像buttonGroup就是button的組合,使用代碼創(chuàng)建和控制)2彈窗/界面/列表項(xiàng),這三者都由控件組成。3共用布局,這一類是為了節(jié)省時間而分的,比方說卡牌游戲中反復(fù)出現(xiàn)的卡牌布局其實(shí)就是共用布局,每個界面重復(fù)制作顯然浪費(fèi),是否有這類關(guān)鍵在于UE結(jié)構(gòu)是否明確和復(fù)雜布局的復(fù)用程度。
如何統(tǒng)一管理 UI 的深度
這條可以引申為Z坐標(biāo)(如果UI中有3D物體或者UI本身就是3D的)、renderQueue、界面的調(diào)用順序等全局屬性的管理。這些內(nèi)容都應(yīng)該在界面制作的時候就記錄在界面信息上,在創(chuàng)建、聚/失焦、關(guān)閉界面時記錄在管理器中。
UI本身的深度其實(shí)很好管理,麻煩在UI上可能會有3D物體和特效,不同的shader可能會導(dǎo)致不同的問題。
打開、關(guān)閉時的動效,以及被遮擋時的動效
動效本身其實(shí)更應(yīng)該當(dāng)作項(xiàng)目需求而不是框架需求。首先建議有單獨(dú)的動效管理器,其次如果域名出售規(guī)劃中對動效規(guī)劃不明確,可以放在具體實(shí)現(xiàn)中。
如果項(xiàng)目中沒有靠譜的UE設(shè)計,框架做得越多其實(shí)越累。引用程序界的質(zhì)能公式:error=(more code)^{2}
3DUI相比2D多了很多問題,要提前想清楚,比方說在界面上有3D物體的情況下(不用renderTexture)打開彈窗時,Z坐標(biāo)和縮放的管理。
總結(jié)
以上是生活随笔為你收集整理的基于 Unity 中的 NGUI 插件,通用的 UI 如何设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏开发者需要注意的4个内存使用问题
- 下一篇: 手机格斗网游该如何避免延迟?