先声明一下,这个简易UI框架是我根据网上的一个UI框架进行修改的阉割版。
原文章地址:http://www.cnblogs.com/LiuGuozhu/p/6416098.html
首先
编辑基础UI窗体 UIbase脚本:
namespace SUIFW
{
public class UIBase : MonoBehaviour
{
// 显示状态
public virtual void Display()
{
this.gameObject.SetActive(true);
}
// 隐藏状态
public virtual void Hiding()
{
this.gameObject.SetActive(false);
}
// 重新显示状态
public virtual void Redisplay()
{
this.gameObject.SetActive(true);
}
// 冻结状态
public virtual void Freeze()
{
this.gameObject.SetActive(true);
}
}
}
上述代码中,主要定义了UI窗体基类的四个重要虚方法,分别对应窗体的打开显示、隐藏、重新显示、窗体冻结(即:窗体显示在其他窗体下面)。方便窗体在不同状态下,针对不同的行为进一步做处理操作。例如,当窗体为“隐藏”与“冻结”状态时,如果此窗体有针对远程服务的网络连接(Socket套接字)时,则需要关闭网络连接,以节省网络资源。
定义“UI管理器”(UIManager.cs) 脚本,这是UI框架中的核心脚本,主要负责UI窗体的加载、缓存、以及对于“UI窗体基类”的各种生命周期的操作(显示、隐藏、重新显示、冻结)。
namespace SUIFW
{
public class UIManager : MonoBehaviour
{
//定义单例
private static UIManager instance = null;
// 缓存所有UI窗体
private static Dictionary<string, UIBase> DicAllUIForm;
// 当前显示的UI窗体
private static Dictionary<string, UIBase> DicCurrentShowUIForm;
// 根节点
private Transform CanvasNode;
// 创建单例
public static UIManager GetInstance()
{
if (instance == null)
{
instance = new GameObject("UIManager").AddComponent<UIManager>();
}
return instance;
}
public void Awake()
{
// 找到根节点
CanvasNode = GameObject.FindGameObjectWithTag("TagCanvas").transform;
// 实例化缓存所有UI窗体的字典
DicAllUIForm = new Dictionary<string, UIBase>();
// 实例化缓存当前显示的UI窗体的字典
DicCurrentShowUIForm = new Dictionary<string, UIBase>();
// 将CanvasNode设为该脚本所在物体的父物体
this.gameObject.transform.SetParent(CanvasNode, false);
// 保证父物体在切换场景的时候不会被删除
DontDestroyOnLoad(CanvasNode);
}
/// <summary>
/// 显示UI的方法
/// </summary>
/// <param name="uiFormName"></param>
public void ShowUIForm(string uiFormName)
{
// 加载返回的UI窗体的基类
UIBase uibase = null;
if (string.IsNullOrEmpty(uiFormName))
{
return;
}
// 根据UI窗体的名称,加载到“所有UI窗体”集合中
uibase = LoadFormsToAllUIFormsCatch(uiFormName);
if (uibase == null)
{
return;
}
LoadCurrntCatch(uiFormName);
}
/// <summary>
/// 关闭UI窗体
/// </summary>
/// <param name="uiFormName"></param>
public void CloseUIForm(string uiFormName)
{
// 加载返回的UI窗体的基类
UIBase uibase;
if (string.IsNullOrEmpty(uiFormName))
{
return;
}
DicAllUIForm.TryGetValue(uiFormName, out uibase);
if (uibase == null)
{
return;
}
ExitUIForm(uiFormName);
}
// 加载所有UI窗体
private UIBase LoadFormsToAllUIFormsCatch(string uiFormName)
{
// 加载返回的UI窗体的基类
UIBase uibaseResult = null;
DicAllUIForm.TryGetValue(uiFormName, out uibaseResult);
if (uibaseResult == null)
{
uibaseResult = LoadUIForm(uiFormName);
}
return uibaseResult;
}
// 加载UI窗体
private UIBase LoadUIForm(string uiFormName)
{
// UI窗体路径
string strUIFormPath = "Prefab/" + uiFormName;
GameObject goCloneUIPrefab = null;
UIBase uibase = null;
if (!string.IsNullOrEmpty(strUIFormPath))
{
goCloneUIPrefab = ResourcesMgr.GetInstance().LoadAsset(strUIFormPath, false);
}
if (goCloneUIPrefab != null)
{
uibase = goCloneUIPrefab.GetComponent<UIBase>();
if (uibase == null)
{
Debug.Log("出错");
return null;
}
goCloneUIPrefab.transform.SetParent(CanvasNode, false);
}
// 设置隐藏
goCloneUIPrefab.SetActive(false);
// 把预设体加入到“所有UI窗体”集合中
DicAllUIForm.Add(uiFormName, uibase);
return uibase;
}
/// <summary>
/// 加载当前窗体
/// </summary>
/// <param name="uiFormName"></param>
private void LoadCurrntCatch(string uiFormName)
{
UIBase uibase;
UIBase uibaseFormAll;
DicCurrentShowUIForm.TryGetValue(uiFormName, out uibase);
if (uibase != null)
{
return;
}
DicAllUIForm.TryGetValue(uiFormName, out uibaseFormAll);
if (uibaseFormAll != null)
{
DicCurrentShowUIForm.Add(uiFormName, uibaseFormAll);
uibaseFormAll.Display();
}
}
/// <summary>
/// 退出指定UI窗体
/// </summary>
/// <param name="strUIFormName"></param>
private void ExitUIForm(string strUIFormName)
{
UIBase uibase;
DicCurrentShowUIForm.TryGetValue(strUIFormName, out uibase);
if (uibase == null)
{
return;
}
uibase.Hiding();
DicCurrentShowUIForm.Remove(strUIFormName);
}
}
}
接下来的脚本下次有空再继续更新。。。。。。。