背景

在一个Unity项目中或多或少需要一些UI,如设置页面,登录页面等,当页面过多时,使用一个通用的UI框架来进行针对性开发会大大减少造轮子的过程。

以下即为参考之前做过的一些项目整理出来的一个易于实现且扩展性比较强的UI界面管理的简易框架的实现思路。

思路概述

将所有的UI界面统一继承一个基类,在基类中实现UI的显示隐藏等UI通用功能,然后定义一个管理类将所有的界面信息放入字典中进行统一管理。重写系统的监听方法,实现对按钮的等UI的监听,并开放一个接口来给需要监听的UI来调用添加监听与相应委托事件。

具体实现代码及其思路梳理

UI路径信息

将所有的UI提前制作好预制体保存在相应路径中,建立一个UIPathData类来封装UI的路径和信息。在类中用一个字典来保存路径和名称,另设几个基本变量来保存当前UI的状态。

public class UIPathData
{
    //路径保存和名称保存
    public static Dictionary<string, UIPathData> dicName = new Dictionary<string, UIPathData>();
    //资源名称
    public string dName;
    //是否入栈
    public bool IsPush = true;
    //是否关闭所有栈中的界面,用于不需要返回弹出栈中的界面,主要是一,二级界面用
    public bool IsCloseAllUI = false;
    //默认UI缩放应该根据分辨率缩放
    public float UIRootScale = 1;
}

在类的构造方法中设置界面加载所需的参数如界面资源名称、所在层级、父节点锚点类型等。

public UIPathData(string uiName)
{
    dName = uiName;
    if (!dicName.ContainsKey(dName))
    {
        dicName.Add(dName, this);//将所有实例化的UI都添加进字典方便管理
    }
}

然后在类中实现一些静态方法方便对字典的查询

public static UIPathData GetByName(string name)
{
    UIPathData ret = null;
    if (!dicName.TryGetValue(name, out ret))
    {
        return null;
    }
    return ret;
}
public static void ClearData()
{
    dicName.Clear();
}

经过以上步骤我们便有了一个保存有UI的路径等信息的字典,并且通过实例化即可将UI加入字典来进行管理。所以在类中创建一个新的类,在类中将所有的UI进行实例化便可直接获得保存有所有UI的字典。当有新的UI需要加入项目时也只需要在此进行实例化即可。

public class UIPathInfo
{
    public static UIPathData UICanvas1 = new UIPathData("UICanvas1");
    public static UIPathData UICanvas2 = new UIPathData("UICanvas2");
}

UI的基类

对于每个UI预制体的逻辑,我们先创建一个UI基类BaseUI。在该类中用一个字典来存放当前UI界面用到的所有物体。

public class BaseUI : MonoBehaviour{
    //描述:保存当前UI界面用到的所有物体
    public Dictionary<string, GameObject> UI = new Dictionary<string, GameObject>();
    //保存当前资源路径信息
    public UIPathData CurPath { get; set; }
}

每个UI都需要显示、隐藏、销毁及初始化的功能,于是把它们添加进基类并定义为虚方法

//初始化方法(可重写)
public virtual void Init(){}
//隐藏
public void DisActiveUI(){ gameObject.SetActive(false); }
//显示
public void ActiveUI(){ gameObject.SetActive(true); }
//销毁UI
public void DestroyUI(){ GameObject.Destroy(gameObject); }