Files
plugin-library/Assets/UI/Scripts/UIFramework/Runtime/UIViewBase/UILayer.cs
2025-09-18 18:25:40 +08:00

141 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using UnityEngine;
namespace SkierFramework
{
public enum UILayer
{
SceneLayer = 1000,
BackgroundLayer = 2000,
NormalLayer = 3000,
InfoLayer = 4000,
TopLayer = 5000,
TipLayer = 6000,
BlackMaskLayer = 7000,
}
public class UILayerLogic
{
public UILayer layer;
public Canvas canvas;
private int maxOrder;
private HashSet<int> orders;
public Stack<UIViewController> openedViews;
public UILayerLogic(UILayer layer, Canvas canvas)
{
this.layer = layer;
this.canvas = canvas;
maxOrder = (int)layer;
orders = new HashSet<int>();
openedViews = new Stack<UIViewController>();
}
public void CloseUI(UIViewController closedUI)
{
int order = closedUI.order;
PushOrder(closedUI);
closedUI.order = 0;
if (openedViews.Count > 0)
{
var topViewController = openedViews.Peek();
// 拿到最上层UI如果被暂停的话则恢复
// 暂停和恢复不影响其是否被覆盖隐藏只要不是最上层UI都应该标记暂停状态
if (topViewController != null && topViewController.isPause)
{
topViewController.isPause = false;
if (topViewController.uiView != null)
{
topViewController.uiView.OnResume();
}
}
if (!closedUI.isWindow)
{
foreach (var viewController in openedViews)
{
if (viewController != closedUI
&& viewController.isOpen
&& viewController.order < order)
{
viewController.AddTopViewNum(-1);
}
}
}
}
}
public void OpenUI(UIViewController openedUI)
{
if (openedUI.order == 0)
{
openedUI.order = PopOrder(openedUI);
}
foreach (var viewController in openedViews)
{
if (viewController != openedUI
&& viewController.isOpen
&& viewController.order < openedUI.order
&& viewController.uiView != null)
{
if (!viewController.isPause)
{
viewController.isPause = true;
viewController.uiView.OnPause();
}
if (!openedUI.isWindow)
{
viewController.AddTopViewNum(1);
}
}
}
}
public void PushOrder(UIViewController closedUI)
{
int order = closedUI.order;
if (orders.Remove(order))
{
// 重新计算最大值
maxOrder = (int)layer;
foreach (var item in orders)
{
maxOrder = Mathf.Max(maxOrder, item);
}
// 移除界面
List<UIViewController> list = ListPool<UIViewController>.Get();
while (openedViews.Count > 0)
{
var view = openedViews.Pop();
if (view != closedUI)
{
list.Add(view);
}
else
{
break;
}
}
for (int i = list.Count - 1; i >= 0; i--)
{
openedViews.Push(list[i]);
}
ListPool<UIViewController>.Release(list);
}
}
public int PopOrder(UIViewController uIViewController)
{
maxOrder += 10;
orders.Add(maxOrder);
openedViews.Push(uIViewController);
return maxOrder;
}
}
}