在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);
}