using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
public class PanelMgr : MonoBehaviour {
//单利
public static PanelMgr _instance;
//场景中的Canvas
private GameObject canvas;
//存放已经打开的UI面板
public Dictionary<string, PanelBase> panelDic;
//存放各层级对应的父物体
private Dictionary<PanelLayer, Transform> layerDic;
void Awake()
{
_instance = this;
InitLayer();
panelDic = new Dictionary<string, PanelBase>();
}
//初始化层
private void InitLayer()
{
canvas = GameObject.Find("Canvas");
if (canvas == null) return;
layerDic = new Dictionary<PanelLayer, Transform>();
foreach (PanelLayer p1 in Enum.GetValues(typeof(PanelLayer)))
{
string name = p1.ToString();
Transform t = canvas.transform.Find(name);
layerDic.Add(p1, t);
}
}
//打开面板
public void OpenPanel<T>(string skinPath,params object[] args) where T:PanelBase
{
string name = typeof(T).ToString();
if (panelDic.ContainsKey(name)) return;
//面板脚本
PanelBase panel = canvas.AddComponent<T>();
panel.Init(args);
panelDic.Add(name, panel);
//加载皮肤
skinPath = (skinPath != "" ? skinPath : panel.skinPath);
GameObject skin = Resources.Load<GameObject>(skinPath);
if (skin == null) return;
panel.skin = (GameObject)Instantiate(skin);
//坐标
Transform skinTrans = panel.skin.transform;
PanelLayer layer = panel.layer;
Transform parent = layerDic[layer];
skinTrans.SetParent(parent, false);
//panel生命周期
panel.OnShowing();
panel.OnShowed();
}
//关闭面板
public void ClosePanel(string name)
{
PanelBase panel = (PanelBase)panelDic[name];
if (panel == null) return;
panel.OnShowing();
panelDic.Remove(name);
panel.OnClosed();
GameObject.Destroy(panel.skin);
Component.Destroy(panel);
}
}
public enum PanelLayer
{
//面板
Panel,
//提示信息
Tips
}
PanelMgr-----罗培羽
Unity UI管理系统
最新推荐文章于 2023-10-11 19:09:48 发布
本文介绍了一个基于Unity的游戏UI管理系统实现方案,包括单例模式的应用、层级化的UI管理方式以及动态加载和销毁面板的方法。该系统使用C#语言编写,通过枚举定义了不同的UI层,并利用字典来追踪当前打开的所有UI面板。
3649

被折叠的 条评论
为什么被折叠?



