简易 UI 框架
//==========================
// - FileName: IBaseManager.cs
// - Created: true.
// - CreateTime: 2020/07/02 18:00:58
// - Email: 1670328571@qq.com
// - Region: China WUHAN
// - Description: 管理者接口
//==========================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface IBaseManager
{
void OnInit();
void OnUpdate();
void OnDestroy();
}
//==========================
// - FileName: BaseManager.cs
// - Created: true.
// - CreateTime: 2020/07/02 18:02:56
// - Email: 1670328571@qq.com
// - Region: China WUHAN
// - Description:
//==========================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BaseManager:IBaseManager
{
protected GameManager gameManager;
public BaseManager(GameManager gameManager)
{
this.gameManager = gameManager;
}
public virtual void OnDestroy()
{
}
public virtual void OnInit()
{
}
public virtual void OnUpdate()
{
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 对Dictory的扩展
/// </summary>
public static class DictionaryExtension {
/// <summary>
/// 尝试根据key得到value,得到了的话直接返回value,没有得到直接返回null
/// this Dictionary<Tkey,Tvalue> dict 这个字典表示我们要获取值的字典
/// </summary>
public static Tvalue TryGet<Tkey, Tvalue>(this Dictionary<Tkey, Tvalue> dict, Tkey key)
{
Tvalue value;
dict.TryGetValue(key, out value);
return value;
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
public class UIManager: BaseManager
{
///
/// 单例模式的核心
/// 1,定义一个静态的对象 在外界访问 在内部构造
/// 2,构造方法私有化
//private static UIManager _instance;
//public static UIManager Instance
//{
// get
// {
// if (_instance == null)
// {
// _instance = new UIManager();
// }
// return _instance;
// }
//}
private Transform canvasTransform;
private Transform CanvasTransform
{
get
{
if (canvasTransform == null)
{
canvasTransform = GameObject.Find("Canvas").transform;
}
return canvasTransform;
}
}
private Dictionary<UIPanelType, string> panelPathDict;//存储所有面板Prefab的路径
private Dictionary<UIPanelType, BasePanel> panelDict;//保存所有实例化面板的游戏物体身上的BasePanel组件
private Stack<BasePanel> panelStack;
private MessagePanel msgPanel;
private UIPanelType panelTypeToPush = UIPanelType.None;
public UIManager(GameFacade facade) : base(facade)
{
ParseUIPanelTypeJson();
}
public override void OnInit()
{
base.OnInit();
PushPanel(UIPanelType.Message);
PushPanel(UIPanelType.Start);
}
public override void Update()
{
if (panelTypeToPush != UIPanelType.None)
{
PushPanel(panelTypeToPush);
panelTypeToPush = UIPanelType.None;
}
}
public void PushPanelSync(UIPanelType panelType)
{
panelTypeToPush = panelType;
}
/// <summary>
/// 把某个页面入栈, 把某个页面显示在界面上
/// </summary>
public BasePanel PushPanel(UIPanelType panelType)
{
if (panelStack == null)
panelStack = new Stack<BasePanel>();
//判断一下栈里面是否有页面
if (panelStack.Count > 0)
{
BasePanel topPanel = panelStack.Peek();
topPanel.OnPause();
}
BasePanel panel = GetPanel(panelType);
panel.OnEnter();
panelStack.Push(panel);
return panel;
}
/// <summary>
/// 出栈 ,把页面从界面上移除
/// </summary>
public void PopPanel()
{
if (panelStack == null)
panelStack = new Stack<BasePanel>();
if (panelStack.Count <= 0) return;
//关闭栈顶页面的显示
BasePanel topPanel = panelStack.Pop();
topPanel.OnExit();
if (panelStack.Count <= 0) return;
BasePanel topPanel2 = panelStack.Peek();
topPanel2.OnResume();
}
/// <summary>
/// 根据面板类型 得到实例化的面板
/// </summary>
/// <returns></returns>
private BasePanel GetPanel(UIPanelType panelType)
{
if (panelDict == null)
{
panelDict = new Dictionary<UIPanelType, BasePanel>();
}
//BasePanel panel;
//panelDict.TryGetValue(panelType, out panel);//TODO
BasePanel panel = panelDict.TryGet(panelType);
if (panel == null)
{
//如果找不到,那么就找这个面板的prefab的路径,然后去根据prefab去实例化面板
//string path;
//panelPathDict.TryGetValue(panelType, out path);
string path = panelPathDict.TryGet(panelType);
GameObject instPanel = GameObject.Instantiate(Resources.Load(path)) as GameObject;
instPanel.transform.SetParent(CanvasTransform,false);
instPanel.GetComponent<BasePanel>().UIMng = this;
instPanel.GetComponent<BasePanel>().Facade = facade;
panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());
return instPanel.GetComponent<BasePanel>();
}
else
{
return panel;
}
}
[Serializable]
class UIPanelTypeJson
{
public List<UIPanelInfo> infoList;
}
private void ParseUIPanelTypeJson()
{
panelPathDict = new Dictionary<UIPanelType, string>();
TextAsset ta = Resources.Load<TextAsset>("UIPanelType");
UIPanelTypeJson jsonObject = JsonUtility.FromJson<UIPanelTypeJson>(ta.text);
foreach (UIPanelInfo info in jsonObject.infoList)
{
//Debug.Log(info.panelType);
panelPathDict.Add(info.panelType, info.path);
}
}
public void InjectMsgPanel(MessagePanel msgPanel)
{
this.msgPanel = msgPanel;
}
public void ShowMessage(string msg)
{
if (msgPanel == null)
{
Debug.Log("无法显示提示信息,MsgPanel为空");return;
}
msgPanel.ShowMessage(msg);
}
public void ShowMessageSync(string msg)
{
if (msgPanel == null)
{
Debug.Log("无法显示提示信息,MsgPanel为空"); return;
}
msgPanel.ShowMessageSync(msg);
}
/// <summary>
/// just for test
/// </summary>
//public void Test()
//{
// string path ;
// panelPathDict.TryGetValue(UIPanelType.Knapsack,out path);
// Debug.Log(path);
//}
}
Json
{
"infoList":
[
{"panelTypeString":"ItemMessage",
"path":"UIPanel/ItemMessagePanel"},
{"panelTypeString":"Knapsack",
"path":"UIPanel/KnapsackPanel"},
{"panelTypeString":"MainMenu",
"path":"UIPanel/MainMenuPanel"},
{"panelTypeString":"Shop",
"path":"UIPanel/ShopPanel"},
{"panelTypeString":"Skill",
"path":"UIPanel/SkillPanel"},
{"panelTypeString":"System",
"path":"UIPanel/SystemPanel"},
{"panelTypeString":"Task",
"path":"UIPanel/TaskPanel"}
]
}
//==========================
// - FileName: UIPanelInfo.cs
// - Created: true.
// - CreateTime: 2020/06/26 00:38:38
// - Email: 1670328571@qq.com
// - Region: China WUHAN
// - Description:
//==========================
using UnityEngine;
using System.Collections;
using System;
[Serializable]
public class UIPanelInfo : ISerializationCallbackReceiver
{
[NonSerialized]
public UIPanelType panelType;
public string panelTypeString;
public string path;
// 反序列化 从文本信息 到对象
public void OnAfterDeserialize()
{
UIPanelType type = (UIPanelType)System.Enum.Parse(typeof(UIPanelType), panelTypeString);
panelType = type;
}
public void OnBeforeSerialize()
{
}
}
//==========================
// - FileName: UIPanelType.cs
// - Created: true.
// - CreateTime: 2020/06/26 00:39:01
// - Email: 1670328571@qq.com
// - Region: China WUHAN
// - Description:
//==========================
using UnityEngine;
using System.Collections;
using System;
public enum UIPanelType
{
None,
ItemMessage,
Knapsack,
MainMenu,
Shop,
Skill,
System,
Task
}