1、代码
public class uimanager
{
private static uimanager instance = new uimanager();
public static uimanager instance => instance;
//存储显示着的面板脚本(不是面板gameobject),每显示一个面板就存入字典
//隐藏的时候获取字典中对应面板 进行隐藏
private dictionary<string, basepanel> paneldic = new dictionary<string, basepanel>();
//得到canvas用于设置为面板父对象
private transform canvastrans;
private uimanager()
{
//将canvas作为预设体,ui管理器启动时创建canvas
gameobject canvas = gameobject.instantiate(resources.load<gameobject>("ui/canvas"));
//得到创建的canvas
canvastrans = canvas.transform;
//不移除canvas,保证整个游戏中只有一个
gameobject.dontdestroyonload(canvas);
}
//显示面板
public t showpanel<t>() where t:basepanel
{
//保证泛型t的类型和预设体名字一样(规则)
string panelname = typeof(t).name;
//判断字典中是否已经有这个面板
if (paneldic.containskey(panelname))
{
return paneldic[panelname] as t;
}
//如果字典中没有
//根据面板名字动态创建预设体 设置父对象
gameobject panelobj = gameobject.instantiate(resources.load<gameobject>("ui/" + panelname));
//把这个对象放到场景canvas下面
panelobj.transform.setparent(canvastrans,false);
//
t panel = panelobj.getcomponent<t>();
//把这个面板脚本 存储到字典中
paneldic.add(panelname, panel);
panel.showme();
return panel;
}
/// <summary>
/// 隐藏面板
/// </summary>
/// <typeparam name="t">面板类型</typeparam>
public void hidepanel<t>() where t : basepanel
{
//根据泛型得名字
string panelname = typeof(t).name;
//判断当前显示的面板有没有传入的面板
if (paneldic.containskey(panelname))
{
//面板淡出完毕后删除
paneldic[panelname].hideme(()=>
{
gameobject.destroy(paneldic[panelname].gameobject);
//删除字典里面存储的面板脚本
paneldic.remove(panelname);
});
}
}
//得到面板
public t getpanel<t>() where t : basepanel
{
string panelname = typeof(t).name;
if (paneldic.containskey(panelname))
{
return paneldic[panelname] as t;
}
//没有对应面板返回空
return null;
}
}
2、如何使用
创建一个测试的ui面板(随便乱拼),将他作为预设体
创建一个测试类
public class testmain : monobehaviour
{
// start is called before the first frame update
void start()
{
uimanager.instance.showpanel<testpanel>();
}
// update is called once per frame
void update()
{
}
}
启动发现已经动态创建了canvas和对应面板
发表评论