这里先定义三个核心功能:
1:UI窗体的自动加载功能。
2:缓存UI窗体。
3:窗体生命周期(状态)管理。
UI框架设计主要目的,就是尽可能的完成一些与具体游戏功能逻辑无关的一些底层事务性的功能实现。这些功能最好是自动或者是半自动的实现,无须客户程序(调用框架的程序)再去过多处理与关心。
准备工作: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;
}
上述三个核心枚举类型,解释如下:
上图是我们定义的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
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删