仅作学习,不做任何商业用途
不是源码,不是源码!
是我通过"照虎画猫"写的,可能有些小修改
不提供素材,所以应该不算是盗版资源,侵权删
唐老狮 UGUI 实战学习笔记-CSDN博客,面板基类的脚本在这
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
//单例模式:
public class UIManger
{
//基础变量
private Transform Canvas;
//存储面板的字典
Dictionary<string, 面板基类> panels = new Dictionary<string, 面板基类>();
//不对外访问的构造函数
private UIManger() {
//获取Canvas画布,因为不管什么面板的父对象都要是画布
//之所以用transform类型是因为其有个设置父对象的静态方法
Canvas = GameObject.Find("Canvas").transform;
GameObject.DontDestroyOnLoad(Canvas.transform);
}
private static UIManger uIManger = new UIManger();//唯一实例
public static UIManger Instance = uIManger;//访问入口
//显示面板
public T ShowPanel<T>() where T : 面板基类
{
//根据泛型类型 得到面板名字
string PanelName =typeof(T).Name;
if(panels.ContainsKey(PanelName)==true) {
return (T)panels[PanelName];
}
//加载当前面板的预设体并设置Canvas为父对象
GameObject PanelObj = (GameObject)GameObject.Instantiate(Resources.Load(PanelName+"UI/"));
PanelObj.transform.SetParent(Canvas, false);
//存储和显示面板
T panel = PanelObj.GetComponent<T>();
panels.Add(PanelName, panel);
panel.ShowMe();
return panel;
}
//隐藏面板,hideOrDel=true为hide隐藏,flase为Del删除
public void HidePanel<T>(bool hideOrDel=true) where T : 面板基类
{
//根据泛型类型 得到面板名字
string PanelName = typeof(T).Name;
if(panels.ContainsKey(PanelName)==true)
{
if(hideOrDel)
{
panels[PanelName].HideMe(//淡出后,删除面板,删去存储在字典内的键值对
() => {
GameObject.Destroy(panels[PanelName].gameObject);
panels.Remove(PanelName);
}
);
}
else {
GameObject.Destroy(panels[PanelName].gameObject);
panels.Remove(PanelName);
}
}
}
//获得当前显示的面板
public T GetPanel<T>() where T : 面板基类 {
//根据泛型类型 得到面板名字
string PanelName = typeof(T).Name;
if(panels.ContainsKey(PanelName)==true)
{
return (T)panels[PanelName];
}
else
{
return null;
}
}
}