以下列舉UI系統中的要點,脫離出引擎,保留設計思想。
我覺得接口非常重要,即使不同項目之間,重用率也非常的高。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();}
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
例如:同樣是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);}}
例如:ABCDA順序打開界面,然后一路返回,要求能回到A.可以考慮用棧來管理,把UI分為2類:入棧型:普通非入棧型:常駐內存,例如UITop不會入棧
防錯機制:對棧UI數量進行評估,超過N個,如何處理?例如只保留最上層,清除所有下層UI
分兩種情況:
常規出入棧
清空棧,再入棧
Stack m_uiStack = new Stack();void Push(UIWnd wnd){//在UI創建時會把非常駐型UI添加到這個棧中,不能重復添加同樣的}public void Pop(){//當返回時會從棧中取對象并刷新UI}
這兩個使用起來比較順手,另外可借用更多設計模式來解耦,例如外觀模式。
消息分發,調用EventDispatch各模塊自己去監聽消息
P2P,UISystem.FindWindow()直接調用從UISystem中查找目標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圖片和音頻直接替換盡量少用圖片字體常規統計:進入頁面、退出頁面、與服務器通訊操作、模塊停留時長、切到后臺和恢復的時間,以及角色數據相關的
我們經常談DAU、MAU,卻無法分析玩家流失原因、回歸原因,基于這些數據來分析更靠譜一些。
新聞熱點
疑難解答