UI管理器以及BasePanel基本面板

来源:互联网 发布:accp和java 编辑:程序博客网 时间:2024/06/05 15:54
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
//UI管理器
public class UIManager
{
    private static UIManager instance;

    //用字典存储所有存在的页面
    private Dictionary<string, BasePanel> basePanelDic;
    private string pathHead = "Prefab/UIPanel/";
    public static UIManager Instance
    {
        get
        {
            if (instance == null) instance = new UIManager();
            return instance;
        }
    }
    private UIManager()
    {
        basePanelDic = new Dictionary<string, BasePanel>();
    }
    //打开一个面板
    public BasePanel OpenPanel(string panelName, params object[] args)
    {
        //如果存在该面板
        if (basePanelDic.ContainsKey(panelName))
        {
            BasePanel basePanel;
            basePanelDic.TryGetValue(panelName, out basePanel);
            //basePanel已经打开
            if (basePanel.IsOpen)
            {
                //如果面板已经打开,那么我们先关闭再打开(这只是一种策略,你可以更换成其他的策略,而且你可以提供一个策略参数来选择多种策略)
                basePanel.OnCloseBefore(args);
                basePanel.OnOpenBefore(args);
                return basePanel;
            }
            //说明basePanel已经被关闭
            else
            {
                basePanel.OnOpenBefore(args);
                return basePanel;
            }
        }
        else
        {
            //加载预制体,为特定的预制体挂载自身的脚本
            GameObject panelGameObject = null;
            try
            {
                panelGameObject = Resources.Load(pathHead + panelName) as GameObject;
            }
            catch (Exception e)
            {
                Debug.Log(e.Message);
            }
            panelGameObject = GameObject.Instantiate(panelGameObject, GameObject.Find("Canvas").transform);
            basePanelDic.Add(panelName, panelGameObject.GetComponent<BasePanel>());
            basePanelDic[panelName].Init(args);
            basePanelDic[panelName].OnOpenBefore(args);
            return basePanelDic[panelName];
        }
    }
    //关闭一个面板
    public void ClosePanel(string panelName, params object[] args)
    {
        if (basePanelDic.ContainsKey(panelName) == false)
        {
            Debug.Log("你尝试关闭不存在的面板: " + panelName);
            return;
        }
        BasePanel basePanel;
        basePanelDic.TryGetValue(panelName, out basePanel);
        if (basePanel.IsOpen == false)
        {
            Debug.Log("你尝试关闭已经关闭的面板: " + panelName);
            return;
        }
        basePanel.OnCloseBefore();
    }
    //关闭所有的面板
    public void CloseAllPanel()
    {
        foreach (var item in basePanelDic)
        {
            item.Value.OnCloseBefore();
        }
    }
    //得到面板的状态,打开或者关闭,如果不存在则返回关闭
    public bool GetPanelState(string panelName)
    {
        BasePanel basePanel;
        if(basePanelDic.TryGetValue(panelName, out basePanel))
        {
            return basePanel.IsOpen;
        }
        Debug.Log("你查询的面板不存在: " + panelName);
        return false;
    }
    //得到一个面板
    public BasePanel GetPanel(string panelName)
    {
        BasePanel basePanel;
        if (basePanelDic.TryGetValue(panelName, out basePanel))
        {
            return basePanel;
        }
        else return null;
    }
}

//BasePanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class BasePanel : MonoBehaviour
{
    protected bool isOpen;
    public bool IsOpen { get { return isOpen; } }
    public BasePanel()
    {
        isOpen = true;
    }
    public virtual void Init(params object[]args)
    {
        
    }
    public virtual void OnOpenBefore(params object[] args)
    {
        this.isOpen = true;
        //设置他的父物体的Active = true
        this.gameObject.SetActive(true);
        //设置sprite值加1
    }
    public virtual void OnCloseBefore(params object[] args)
    {
        this.isOpen = false;
        //设置他的父物体的Active = true
        this.gameObject.SetActive(false);
    }
}



原创粉丝点击