Unity3D游戏制作之 UI框架设计(二):基础框架设计

这里先定义三个核心功能:

   1:UI窗体的自动加载功能。

   2:缓存UI窗体。

   3:窗体生命周期(状态)管理。

     UI框架设计主要目的,就是尽可能的完成一些与具体游戏功能逻辑无关的一些底层事务性的功能实现。这些功能最好是自动或者是半自动的实现,无须客户程序(调用框架的程序)再去过多处理与关心。

  •    BaseUIForms    基础UI窗体脚本(父类,其他窗体都继承此脚本)
  •    UIManger.cs    UI窗体管理器脚本(框架核心脚本)
  •    UIType         窗体类型 (引用窗体的重要属性[枚举类型])

准备工作:1、制作Ui界面预制体       2、考虑Ui界面类型   

-----创建 UiType 类   Ui界面类型 (引用窗体的重要属性[枚举类型])

public class UiType
{
    //是否清空“栈集合”
    public bool IsClearStack = false;
    //UI窗体(位置)类型
    public UiWindType UiWindType = UiWindType.Normal;
    //UI窗体显示类型
    public UiShowMode UiShowMode = UiShowMode.Normal;
    //UI窗体透明度类型
    public UiTransparencyType UiTransparencyType = UiTransparencyType.Transparency;
}

/// <summary>
/// UI窗体(位置)类型
/// </summary>
public enum UiWindType
{
    Normal, //普通窗体
    Fixed,  //固定窗体
    PopUp,  //弹出窗体
}
/// <summary>
/// UI窗体的显示类型
/// </summary>
public enum UiShowMode
{
    Normal,         //普通
    ReverseChange,  //反向切换
    HideOther,      //隐藏其他
}
/// <summary>
/// UI窗体透明度类型
/// </summary>
public enum UiTransparencyType
{
    Transparency, //完全透明,不能穿透
    Translucence, //半透明,不能穿透
    ImPenetrable, //低透明度,不能穿透
    Penetrable,   //可以穿透
}

public enum UiWind
{
    BattleEndWind,
    BattleWind,
    BuyWind,
    ChatWind,
    CopyWind,
    CreateWind,
    DataWind,
    DataText,
    DynamicWind,
    GuideWind,
    LoadingWind,
    LoginWind,
    MainCityWind,
    StrongWind,
    TaskWind,
}
/// <summary>
/// 解析xml路径
/// </summary>
public class UiWindCfg
{
    public int Id;
    public UiWind Key;
    public string Value;
}

上述三个核心枚举类型,解释如下:

  1.  UiWindType :表示Unity层级视图中挂载不同类型窗体的空节点。这里Fixed 表示固定窗体,表示可以挂载"非全屏非弹出窗体"。
  2.  UiShowType :表示窗体不同的显示方式。Normal 类型表示窗体与其他窗体可以并列显示; HideOther类型表示窗体显示的时候,需要隐藏所有其他窗体; ReverseChange 窗体主要应用与"弹出窗体",维护多个弹出窗体的层级关系。
  3.  UiTransparencyType 枚举,是定义弹出“模态窗体”不同透明度的类型

上图是我们定义的UGUI 中的“根窗体”预设 "Canvas",在Untiy的层级视图中,可以看到我们定义了若干空节点,用于不同类型的UI窗体加载到不同的“根窗体”预设中,实现不同显示效果。

定义基础UI窗体 BaseUIForms 脚本,代码如下:

public class BaseUiFrame : MonoBehaviour
{
    /* 属性*/
    //当前UI窗体类型
    public UiType CurrentUiType { get; set; } = new UiType();
    #region  窗体的四种(生命周期)状态
    /// <summary>
    /// 显示状态
    /// </summary>
    public virtual void Display()
    {
        gameObject.SetActive(true);
        //设置模态窗体调用(必须是弹出窗体)
        if (CurrentUiType.UiWindType == UiWindType.PopUp)
        {
            UIMaskMgr.Instance().SetMaskWindow(gameObject, CurrentUiType.UiTransparencyType);
        }
    }
    /// <summary>
    /// 隐藏状态
    /// </summary>
    public virtual void Hiding()
    {
        gameObject.SetActive(false);
        //取消模态窗体调用
        if (CurrentUiType.UiWindType == UiWindType.PopUp)
        {
            UIMaskMgr.Instance().CancelMaskWindow();
        }
    }
    /// <summary>
    /// 重新显示状态
    /// </summary>
    public virtual void Redisplay()
    {
        gameObject.SetActive(true);
        //设置模态窗体调用(必须是弹出窗体)
        if (CurrentUiType.UiWindType == UiWindType.PopUp)
        {
            UIMaskMgr.Instance().SetMaskWindow(gameObject, CurrentUiType.UiTransparencyType);
        }
    }
    /// <summary>
    /// 冻结状态
    /// </summary>
    public virtual void Freeze()
    {
        gameObject.SetActive(true);
    }
    #endregion
}

上述代码中,主要定义了UI窗体基类的四个重要虚方法,分别对应窗体的打开显示、隐藏、重新显示、窗体冻结(即:窗体显示在其他窗体下面)。方便窗体在不同状态下,针对不同的行为进一步做处理操作。例如,当窗体为“隐藏”与“冻结”状态时,如果此窗体有针对远程服务的网络连接(Socket套接字)时,则需要关闭网络连接,以节省网络资源。

项目源码工程下载地址:https://github.com/AnderTroy/UIFrameWork

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值