国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

UI框架的思考

2019-11-09 17:36:57
字體:
來源:轉載
供稿:網友

以下列舉UI系統中的要點,脫離出引擎,保留設計思想。

結構

UISystem 負責管理UIWndUIWnd是所有UI的基類拓展UI公用組件,模塊間公用,例如公共彈窗,UIIcon等

接口設計

我覺得接口非常重要,即使不同項目之間,重用率也非常的高。public interface IBaseWindow{public void Show();public void Hide();public void Destroy();public void BringTop();public void SetDepth(int value);public System.Action OnClose;public System.Action OnFinshShow;}interface IWindowAnimation{void EnterAnimation(EventDelegate.Callback onComplete);void LeaveAnimation(EventDelegate.Callback onComplete);void ResetAnimation();}public interface IStack{public void Clear();public void Push(UIWnd wnd);public void Pop();}

UI層級管理

解決不同ENUM_LAYER_TYPE的層級問題

enum ENUM_LAYER_TYPE{NONE,DEFAULT, //深度0TOP, //深度1000POPUP, //深度2000GUIDE, //深度3000LOADING, //深度4000COUNT}假如:A是TOP類型(預設深度200),B是POPUP類型(預設深度200)A的實際深度為1200,1000<A(1000+200)<2000B的實際深度為2200,2000<B(2000+200)<3000

解決相同ENUM_LAYER_TYPE的層級問題

例如:同樣是DEFAULT的A、B、C首先創建A,自動分配深度為0再創建B,自動分配深度為A的深度+1,B的深度為1在創建C,自動分配深度為B的深度+1,C的深度為2

如果我希望A在最上層,因為他們被存入保存在同為DEFAULT的字典中,找出除了A以外最大深度N,把A的深度設為N+1.public class UISystem : MonoBehaviour{Dictionary m_wndDic = new Dictionary();public void BringTop(string value){//找到m_wndDic 中除了A以外最大深度N,把A的深度設為N+1.}}public class UIWnd : MonoBehaviour{enum ENUM_LAYER_TYPE LayerType = ENUM_LAYER_TYPE.NONE;int Depth =0;public void BringTop(){UISystem.Instance.BringTop(gameObject.name);}}

UI導航

例如:ABCDA順序打開界面,然后一路返回,要求能回到A.可以考慮用棧來管理,把UI分為2類:入棧型:普通非入棧型:常駐內存,例如UITop不會入棧

防錯機制:對棧UI數量進行評估,超過N個,如何處理?例如只保留最上層,清除所有下層UI

分兩種情況:

常規出入棧

清空棧,再入棧

Stack m_uiStack = new Stack();void Push(UIWnd wnd){//在UI創建時會把非常駐型UI添加到這個棧中,不能重復添加同樣的}public void Pop(){//當返回時會從棧中取對象并刷新UI}

UI間的通訊

這兩個使用起來比較順手,另外可借用更多設計模式來解耦,例如外觀模式。

消息分發,調用EventDispatch

各模塊自己去監聽消息

P2P,UISystem.FindWindow()直接調用

從UISystem中查找目標UI,注意空引用

UI動畫

主要指入場/出場動畫,一般是根據UI的類型來確定動畫效果,各模塊不用自己去寫。我喜歡玩王者榮耀,它的UI動態效果讓人感覺有活力、很舒服。像PVE界面還特意加強了動態UI。enum ENUM_WND_TYPE{NONE,POPUP, //彈出窗口RETURN_FULL_SCREEN, //全屏有返回窗口DONOT_RETURN_FULL_SCREEN, //全屏無返回窗口GLOBAL, //全局窗口COUNT}public class UIWnd : MonoBehaviour{void onShow(ENUM_WND_TYPE type){switch(type){//具體的動畫//動畫后的回調}}void onDestroy(ENUM_WND_TYPE type){switch(type){//具體的動畫//動畫后的回調}}}

本地化方案

不考慮這些,等做海外版的時候就蛋碎了涉及到圖片、字符串、音頻,必須考慮如何便捷的切換

字符串

所有用于UI顯示的字符串不允許直接寫在腳本里,也不要寫在預設中,而是從xml或者Excel通過id讀取//例如我需要字符串"系統錯誤"string str= TextSystem.Instance.GetText(101);//TextSystem負責根據語言類型從xml中讀取

如果大量信息并且使用頻率不高,可以考慮用html5的展示,給個外部鏈接。參考王者榮耀的英雄攻略界面。

IMG_4588.PNG圖片和音頻直接替換盡量少用圖片字體

特效

例如黑屏、高斯模糊、邊緣模糊,一般非全屏窗口會帶一個這樣的底圖效果特效和UI系統結合時,會有一些裁剪、深度、縮放等問題,需要來解決還需要測試特效對性能的影響,可以進行性能分檔,低端機降低或屏蔽特效

搜集玩家操作信息

UI框架最好能集成常規數據結構搜集的接口,這對運營非常的必要,例如大量玩家在XXX頁面做了XXX操作后就流失了,而不是程序異常導致,基于這個行為來分析流失原因。

常規統計:進入頁面、退出頁面、與服務器通訊操作、模塊停留時長、切到后臺和恢復的時間,以及角色數據相關的

我們經常談DAU、MAU,卻無法分析玩家流失原因、回歸原因,基于這些數據來分析更靠譜一些。

總結

基于插件和需求去定制自己的UI框架,例如Unity的NGUI,itween,poolManager等集成公用UI組件,提高開發效率對性能的評估、資源的管理都需要提前文檔規劃和測試,對產品有整體把控UI熱更新,需要提前定制自己的熱更方案來應對版本迭代,產品運營期間非常重要可視化編程,Unity編輯器擴展做到這點,對Debug和提高開發效率很有幫助,可看看UFrame設計模式,例如常見的MVC、StrangeIoC、MVVM等,選定適合的提前做好UI開發模板,不然很難推廣收集玩家操作信息,分析玩家心理
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平阳县| 城口县| 景德镇市| 宝兴县| 盐城市| 兴安县| 大方县| 万全县| 冀州市| 喀喇| 潞西市| 镇原县| 尼木县| 监利县| 苍南县| 页游| 山丹县| 安徽省| 舞钢市| 淮南市| 山阳县| 三台县| 抚松县| 江华| 廊坊市| 武平县| 旬阳县| 沽源县| 明光市| 罗平县| 定结县| 三亚市| 彝良县| 普安县| 石狮市| 东山县| 泾川县| 阜阳市| 申扎县| 漳州市| 博白县|