Unity フレームワークの学習 - UI マネージャー

UIMマネージャー

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class UIManager : SingletonMonoAutoBase1_DonDestoryOnLoad<UIManager>
{
    private Transform rearmost;
    public Transform Rearmost 
    {
        get
        {
            if (rearmost == null)
                rearmost = transform.Find("RearMost");
            return rearmost;
        }
    }

    private Transform rear;
    public Transform Rear
    {
        get
        {
            if (rear == null)
                rear = transform.Find("Rear");
            return rear;
        }
    }

    private Transform middle;
    public Transform Middle
    {
        get
        {
            if (middle == null)
                middle = transform.Find("Middle");
            return middle;
        }
    }

    private Transform front;
    public Transform Front
    {
        get
        {
            if (front == null)
                front = transform.Find("Front");
            return front;
        }
    }

    private Transform foreFront;
    public Transform ForeFront
    {
        get
        {
            if (foreFront == null)
                foreFront = transform.Find("ForeFront");
            return foreFront;
        }
    }

    //记录当前已经显示的面板
    Dictionary<GameObject, GameObject> panelDistionary = new Dictionary<GameObject, GameObject>();

    /// <summary>
    /// 显示面板
    /// </summary>
    public void ShowPanel(GameObject panelPrefab,E_PanelDisplayLayer layer=E_PanelDisplayLayer.Middle)
    {
        if (panelPrefab==null)
        {
            Debug.LogWarning("显示失败,要显示的面板的预制体为null");
            return;
        }

        //如果当前已经显示了该面板,则不重复显示了,而是直接返回
        if (panelDistionary.ContainsKey(panelPrefab))
            return;

        GameObject panel = Instantiate(panelPrefab);  //创建指定的面板物体
        panel.name = panelPrefab.name;  //给物体改名

        panelDistionary.Add(panelPrefab, panel);  //将该面板的信息记录到字典中


        Transform parent = null;  //记录该面板要放进哪个层中来显示

        switch (layer)
        {
            case E_PanelDisplayLayer.Rearmost:
                parent = Rearmost;
                break;
            case E_PanelDisplayLayer.Rear:
                parent = Rear;
                break;
            case E_PanelDisplayLayer.Middle:
                parent = Middle;
                break;
            case E_PanelDisplayLayer.Front:
                parent = Front;
                break;
            case E_PanelDisplayLayer.ForeFront:
                parent = ForeFront;
                break;
            default:
                break;
        }

        panel.transform.SetParent(transform, false);  //修正面板的位置

        panel.transform.SetParent(parent);  //在指定层显示该面板
    }

    public void HidePanel(GameObject panelPrefab)
    {
        if (panelPrefab == null)
        {
            Debug.LogWarning("显示失败,要隐藏的面板的预制体为null");
            return;
        }

        //要隐藏的面板不存在
        if (!panelDistionary.ContainsKey(panelPrefab)) return;

        Destroy(panelDistionary[panelPrefab]);  //销毁面板
        panelDistionary.Remove(panelPrefab);  //移除字典中该面板的信息
    }

    /// <summary>
    /// 隐藏面板--重置方法
    /// </summary>
    public void HidePanel(string panelPrefabName)
    {
        foreach (var item in panelDistionary.Keys)
        {
            if (item.name == panelPrefabName)
            {
                HidePanel(item);
                return;
            }
        }
        return;
    }

    /// <summary>
    /// 判断指定的面板是否显示了
    /// </summary>
    public bool IsPanelShowed(GameObject panelPrefab)
    {
        return panelDistionary.ContainsKey(panelPrefab);
    }

    /// <summary>
    /// 判断指定的面板是否显示了
    /// </summary>
    public bool IsPanelShowed(string panelPrefabName)
    {
        foreach (var item in panelDistionary.Keys)
        {
            if (item.name == panelPrefabName)
            {
                return true;
            }
        }
        return false;
    }

    private void Awake()
    {
        //创建画布
        CreateOverlayCanvas();

        //创建EventSystem
        CreateEventSystem();

    }

    /// <summary>
    /// 创建画布
    /// </summary>
    void CreateOverlayCanvas()
    {
        //改layer
        gameObject.layer = LayerMask.NameToLayer("UI");

        //添加并设置Canvas组件
        Canvas canvas = gameObject.AddComponent<Canvas>();
        canvas.renderMode = RenderMode.ScreenSpaceOverlay;
        canvas.sortingOrder = 1000;

        //添加并设置CanvasScaler组件
        CanvasScaler canvasScaler = gameObject.AddComponent<CanvasScaler>();
        canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
        canvasScaler.referenceResolution = new Vector2(Screen.width, Screen.height);
        canvasScaler.matchWidthOrHeight = Screen.width > Screen.height ? 1 : 0;

        //添加并设置Graphic Raycaster 组件
        GraphicRaycaster graphicRaycaster = gameObject.AddComponent<GraphicRaycaster>();

        //添加子物体,作为显示的层的父物体

        //Rearmost 层的父物体
        GameObject rearmost = new GameObject("RearMost");
        rearmost.transform.SetParent(transform,false);

        //Rear 层的父物体
        GameObject rear = new GameObject("Rear");
        rear.transform.SetParent(transform, false);

        //Middle 层的父物体
        GameObject middle = new GameObject("Middle");
        middle.transform.SetParent(transform, false);

        //Front 层的父物体
        GameObject front = new GameObject("Front");
        front.transform.SetParent(transform, false);

        //Frontmost 层的父物体
        GameObject foreFront = new GameObject("ForeFront");
        foreFront.transform.SetParent(transform, false);

    }

    /// <summary>
    /// 创建EventSystem
    /// </summary>
    void CreateEventSystem()
    {
        //如果场景中已经存在该物体则不创建直接返回
        if (FindObjectOfType<EventSystem>()) return;

        GameObject eventSystem = new GameObject("EventSystem");

        DontDestroyOnLoad(eventSystem);

        eventSystem.AddComponent<EventSystem>();
        eventSystem.AddComponent<StandaloneInputModule>();


    }
}

おすすめ

転載: blog.csdn.net/zaizai1007/article/details/132392068
おすすめ