在unity項目開發中,ui模塊的開發往往占據了很大一部分工作,部分游戲甚至絕大部分的工作都是在ui上,如何高效管理各種界面,這里分享一套高效易用的UI框架。
首先,我們定義一個PanelBase類,作為所有panel的父類,在這個類里,我們可以給panel定義一套生命周期
//初始化
public virtual void Init(){}
//開始面板前
public virtual void OnShowing() { }
//顯示面板后
public virtual void OnShowed() { }
//幀更新
public virtual void Update() { }
//關閉前
public virtual void OnClosing() { }
//關閉后
public virtual void OnClosed() { }
所有界面類需要繼承PanelBase類,並重寫這套生命周期函數,當然你不必每個界面都重寫這生命周期中所有的函數,具體情況還得具體分析。這里以一個界面LoginPanel為例:
public class LoginPanel : PanelBase
{
#region 生命周期
//初始化
public override void Init(s)
{
//dosomething
}
public override void OnShowing()
{
base.OnShowing();
loginBtn.onClick.AddListener(OnLoginClick);
regBtn.onClick.AddListener(OnRegClick);
}
#endregion
首先,在Init函數中初始化一些屬性參數,OnShowing函數為界面打開時執行的函數,在LoginPanel中也會寫一些本界面的邏輯處理。
最后,需要定義一個PanelManager類,用來負責提供打開和關閉某界面的功能,當需要打開或者關閉某個界面時,調用該類中的open、close函數即可,這樣做的好處自然不必多說:
public void OpenPanel<T>(string skinPath, params object[] args) where T : PanelBase
{
//已經打開
string name = typeof(T).ToString();
if (dict.ContainsKey(name))
return;
//面板腳本
PanelBase panel = canvas.AddComponent<T>();
panel.Init(args);
dict.Add(name, panel);
panel.OnShowing();
panel.OnShowed();
}
//關閉面板
public void ClosePanel(string name)
{
PanelBase panel = (PanelBase)dict[name];
if (panel == null)
return;
panel.OnClosing();
dict.Remove(name);
panel.OnClosed();
GameObject.Destroy(panel.skin);
Component.Destroy(panel);
}
