Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / ui / UiManager.cs
@lijincheng lijincheng on 15 Mar 2023 2 KB ui嵌套打开与关闭

using System;
using Godot;

/// <summary>
/// ui管理类
/// </summary>
public static partial class UiManager
{
    private static bool _init = false;

    private static CanvasLayer _bottomLayer;
    private static CanvasLayer _middleLayer;
    private static CanvasLayer _heightLayer;
    private static CanvasLayer _popLayer;
    
    public static void Init()
    {
        if (_init)
        {
            return;
        }

        _init = true;
        
        //创建ui层
        
        //Bottom
        _bottomLayer = new CanvasLayer();
        _bottomLayer.Name = "BottomLayer";
        _bottomLayer.Layer = 5;
        GameApplication.Instance.AddChild(_bottomLayer);
        
        //Middle
        _middleLayer = new CanvasLayer();
        _middleLayer.Name = "MiddleLayer";
        _middleLayer.Layer = 15;
        GameApplication.Instance.AddChild(_middleLayer);
        
        //Height
        _heightLayer = new CanvasLayer();
        _heightLayer.Name = "HeightLayer";
        _heightLayer.Layer = 25;
        GameApplication.Instance.AddChild(_heightLayer);
        
        //Pop
        _popLayer = new CanvasLayer();
        _popLayer.Name = "PopLayer";
        _popLayer.Layer = 35;
        GameApplication.Instance.AddChild(_popLayer);
    }

    /// <summary>
    /// 获取指定的Ui层根节点
    /// </summary>
    public static CanvasLayer GetUiLayer(UiLayer uiLayer)
    {
        switch (uiLayer)
        {
            case UiLayer.Bottom:
                return _bottomLayer;
            case UiLayer.Middle:
                return _middleLayer;
            case UiLayer.Height:
                return _heightLayer;
            case UiLayer.Pop:
                return _popLayer;
        }

        return null;
    }

    private static UiBase InstantiateUi(string resourcePath)
    {
        var packedScene = ResourceManager.Load<PackedScene>(resourcePath);
        var uiBase = packedScene.Instantiate<UiBase>();
        return uiBase;
    }

    /// <summary>
    /// 根据Ui资源路径打开Ui, 并返回Ui实例, 该Ui资源的场景根节点必须继承<see cref="UiBase"/>
    /// </summary>
    public static UiBase OpenUi(string resourcePath, params object[] args)
    {
        var uiBase = InstantiateUi(resourcePath);
        var canvasLayer = GetUiLayer(uiBase.Layer);
        canvasLayer.AddChild(uiBase);
        uiBase.OnCreateUi();
        uiBase.ShowUi(args);
        return uiBase;
    }

    /// <summary>
    /// 根据Ui资源路径打开Ui, 并返回Ui实例, 该Ui资源的场景根节点必须继承<see cref="UiBase"/>
    /// </summary>
    public static T OpenUi<T>(string resourcePath, params object[] args) where T : UiBase
    {
        return (T)OpenUi(resourcePath, args);
    }

    /// <summary>
    /// 销毁指定Ui
    /// </summary>
    public static void DisposeUi(UiBase uiBase)
    {
        uiBase.DisposeUi();
    }
}