using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UIElements;
public class PanelManager:MonoBehaviour
{
private Transform canvasPos;//场景中的Canvas位置
/// <summary>
/// string =子类面板名
/// BasePanel 里氏替换原则,所有继承了面板基类的子类面板都可以用父类容器装
/// </summary>
private Dictionary<string, BasePanel> panels;//存储所有面板子类的字典
//单例
private static PanelManager instance;
public static PanelManager Instance => instance;
private void Awake() {
if(instance == null) {
instance = this;
DontDestroyOnLoad(gameObject);
}
else{
Destroy(gameObject);
}
//初始化字典
panels = new Dictionary<string, BasePanel>();
panels.Clear();
canvasPos = GameObject.Find("Canvas").transform;//虽然有性能消耗但是只用一次所以可以接受
}
/// <summary>
/// 加载面板
/// </summary>
/// <typeparam name="T">需要加载的子类面板脚本</typeparam>
/// <param name="panelName">需要加载的面板名称</param>
public void LoadPanel<T>(string panelName) where T:BasePanel,new ()
{
T panel = new T();//实例化面板子类
if(canvasPos!=null)
panel.CreatWnd(panelName, canvasPos);
else
Debug.Log("没有找到Canvas");
panels.Add(panelName, panel);
panel.Init();//子类重写的抽象方法,用于执行自己的逻辑
}
public void OpenPanel(string panelName)
{
if (panels.TryGetValue(panelName, out BasePanel curPanel)){
curPanel.OpenWnd(); }
else
Debug.Log($"没有找到正确的面板****{panelName}****,请检查预制体路径或者查看是否有该预制体");
}
public void ClosePanel(string panelName) {
if (panels.TryGetValue(panelName, out BasePanel panel)) {
panel.CloseWnd(); }
else
Debug.Log($"没有找到正确的面板****{panelName}****,请检查预制体路径或者查看是否有该预制体");
}
}
面板基类
cs复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class BasePanel {
protected Transform TempTrans { //记录要打开窗口的位置
get;
private set;
}
//实例化窗口
public virtual void CreatWnd(string wndName,Transform canvas)
{
//加载
GameObject wnd = Resources.Load<GameObject>("Wnd/"+wndName);
if( wnd!=null){
GameObject temp =GameObject.Instantiate(wnd);
temp.transform.SetParent(canvas,false);
//将该窗口的位置记录下来,以便打开和关闭
TempTrans = temp.transform;
CloseWnd(); //首次实例化不要直接打开
}
else{
Debug.Log("没有正确加载到面板");
}
}
//打开窗口
public virtual void OpenWnd()
{
TempTrans.gameObject.SetActive(true);
}
//关闭窗口
public virtual void CloseWnd() {
TempTrans.gameObject.SetActive(false);
}
public abstract void Init();
}
面板子类示例
cs复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestPanel : BasePanel {
//在这里可以写TestWnd自己的逻辑
public override void Init() {
Debug.Log("子类可以在此进行自己的逻辑撰写");
}
}
使用示例
cs复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ctrl : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
PanelManager.Instance.LoadPanel<TestPanel>("AnyWnd");
}
// Update is called once per frame
void Update()
{
if(Input.GetKeyDown(KeyCode.O))
{
PanelManager.Instance.OpenPanel("AnyWnd");
}
if (Input.GetKeyDown(KeyCode.P)) {
PanelManager.Instance.ClosePanel("AnyWnd");
}
}
}