
原始碼下載地址:https://download.csdn.net/download/f402455894/21356757?spm=1001.2014.3001.5501
檔案結構

PanelInfo
using System;
using System.Collections.Generic;
[Serializable]
public class UIPanelInfo
{
public string panelTypeString;
public string path;
}
[Serializable]
public class UIPanelTypeJson
{
public List<UIPanelInfo> infoList;
}
UIPanelType和Json根據專案情況撰寫(切記:panelTypeString 和UIPanelType中的字串還有相對應的UI預制體的名稱要一致)
public class UIPanelType
{
public const string Backpacker = "Panel_Backpacker";
public const string HomePage = "Panel_HomePage";
public const string Shopping = "Panel_Shopping";
public const string System = "Panel_System";
public const string Task = "Panel_Task";
}
{
"infoList":
[
{
"panelTypeString": "Panel_Backpacker",
"path": "UI/Panel_Backpacker"
},
{
"panelTypeString": "Panel_HomePage",
"path": "UI/Panel_HomePage"
},
{
"panelTypeString": "Panel_Shopping",
"path": "UI/Panel_Shopping"
},
{
"panelTypeString": "Panel_System",
"path": "UI/Panel_System"
},
{
"panelTypeString": "Panel_Task",
"path": "UI/Panel_Task"
}
]
}
Manager
using System.Collections.Generic;
using UnityEngine;
public class UIManager
{
private static UIManager _instance;
public static UIManager Instance
{
get
{
if (_instance == null)
_instance = new UIManager();
return _instance;
}
}
private UIManager()
{
ParseUIPanelTypeJson();
GetScenesPanel();
}
private Dictionary<string, string> panelPathDict;
private Dictionary<string, BasePanel> panelDict;
private Stack<BasePanel> panelStack;
private Transform canvesTransform;
private BasePanel[] basePanels;
private Transform CanvesTransform
{
get
{
if (canvesTransform == null)
{
canvesTransform = GameObject.Find("Canvas").transform;
}
return canvesTransform;
}
}
/// <summary>
/// 顯示UI
/// </summary>
/// <param name="panelType">UI名字</param>
public void PushPanel(string panelType)
{
if (panelStack == null)
panelStack = new Stack<BasePanel>();
if (panelStack.Count > 0)
{
//取當前堆疊頂元素
BasePanel topPanel = panelStack.Peek();
topPanel.OnPause();
}
BasePanel basePanel = GetPanel(panelType);
//保證加載出來的東西都在UI畫布的最上層
basePanel.transform.SetSiblingIndex(CanvesTransform.childCount-1);
basePanel.OnEnter();
//將要顯示的UI推入堆疊里
panelStack.Push(basePanel);
}
/// <summary>
/// 隱藏UI
/// </summary>
public void PopPanel()
{
if (panelStack == null)
panelStack = new Stack<BasePanel>();
if (panelStack.Count <= 0)
{
return;
}
//將要隱藏的UI彈出堆疊
BasePanel basePanel_1 = panelStack.Pop();
basePanel_1.OnExit();
if (panelStack.Count <= 0)
{
return;
}
//如果堆疊里還有元素,獲取到當前的UI,讓這個UI變成活躍的狀態
BasePanel basePanel_2 = panelStack.Peek();
basePanel_2.OnResume();
}
/// <summary>
/// 獲得UI
/// </summary>
/// <param name="panelType">UI的名字</param>
/// <returns></returns>
private BasePanel GetPanel(string panelType)
{
if (panelDict == null)
{
panelDict = new Dictionary<string, BasePanel>();
}
//取得字典中的value(dictionary擴展方法)
BasePanel panel = panelDict.TryGet(panelType);
//BasePanel panel;
//panelDict.TryGetValue(panelType, out panel);
if (panel == null)
{
string path = panelPathDict.TryGet(panelType);
GameObject instPanel = GameObject.Instantiate(Resources.Load(path), CanvesTransform, false) as GameObject;
instPanel.name = panelType;
if (panelDict.ContainsKey(panelType))
Debug.LogError("Key值已經存在");
else
panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());
return instPanel.GetComponent<BasePanel>();
}
else
{
return panel;
}
}
/// <summary>
/// 決議Json,將UI的名稱和路徑存入字典中,
/// </summary>
private void ParseUIPanelTypeJson()
{
panelPathDict = new Dictionary<string, string>();
TextAsset ta = Resources.Load<TextAsset>("UIJson/UIPanelType");
UIPanelTypeJson jsonObject = JsonUtility.FromJson<UIPanelTypeJson>(ta.text);
foreach (UIPanelInfo info in jsonObject.infoList)
{
if (panelPathDict.ContainsKey(info.panelTypeString))
Debug.LogError("Key值重復");
else
panelPathDict.Add(info.panelTypeString, info.path);
}
basePanels = CanvesTransform.GetComponentsInChildren<BasePanel>();
}
/// <summary>
/// 獲取到場景中掛載的UI,防止再次從Resources里加載
/// </summary>
private void GetScenesPanel()
{
if (panelDict == null)
{
panelDict = new Dictionary<string, BasePanel>();
}
foreach (BasePanel panel in basePanels)
{
if (panelDict.ContainsKey(panel.name))
Debug.LogError("Key值已經存在");
else
panelDict.Add(panel.name, panel);
}
}
}
將這個腳本掛場景上,場景里建一個Canves
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameRoot : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
UIManager.Instance.PushPanel(UIPanelType.HomePage);
}
}
Base
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(CanvasGroup))]
public class BasePanel : MonoBehaviour
{
public virtual void Start()
{
}
/// <summary>
/// UI每次顯示
/// </summary>
public virtual void OnEnter()
{
}
/// <summary>
/// UI進入失活狀態
/// </summary>
public virtual void OnPause()
{
}
/// <summary>
/// UI被激活
/// </summary>
public virtual void OnResume()
{
}
/// <summary>
/// UI關閉
/// </summary>
public virtual void OnExit()
{
}
}
Extension
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class DictionaryExtension
{
/// <summary>
/// Dictionary擴展方法,獲取對應Key的Value值
/// </summary>
/// <typeparam name="Tkey"></typeparam>
/// <typeparam name="Tvalue"></typeparam>
/// <param name="dict"></param>
/// <param name="tkey"></param>
/// <returns></returns>
public static Tvalue TryGet<Tkey,Tvalue>(this Dictionary<Tkey, Tvalue> dict,Tkey tkey)
{
Tvalue tvalue;
dict.TryGetValue(tkey, out tvalue);
return tvalue;
}
}
PanelUI 實體
根據具體專案情況撰寫
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Panel_System : BasePanel
{
public CanvasGroup canvasGroup;
public override void OnEnter()
{
canvasGroup.alpha = 1;
canvasGroup.blocksRaycasts = true;
}
public override void OnExit()
{
canvasGroup.alpha = 0;
canvasGroup.blocksRaycasts = false;
}
public void OnClosePanel()
{
UIManager.Instance.PopPanel();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Panel_HomePage : BasePanel
{
public CanvasGroup canvasGroup;
public override void OnPause()
{
canvasGroup.blocksRaycasts = false;
}
public override void OnResume()
{
canvasGroup.blocksRaycasts = true;
}
public void OnPushPanel(string str)
{
UIManager.Instance.PushPanel(str);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295498.html
標籤:其他
