Files
plugin-library/Assets/00.StaryEvoTools/Runtime/Tools/PanelSystem/Manager/SpriteRendererSystem.cs
zhangzheng 2930feb3d8 111
2025-12-12 16:34:53 +08:00

235 lines
6.7 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 System.Threading.Tasks;
using UnityEngine;
namespace Stary.Evo.UIFarme
{
public interface ISpriteRenderSystem : ISystem
{
/// <summary>
/// UI的入栈操作此操作会显示一个面板
/// </summary>
Task PushQueue<T>(string packageName, string prefabName, Transform parent = null)
where T : IBaseRenderPanel, new();
/// <summary>
/// UI的入栈操作此操作会显示一个面板
/// </summary>
Task PushStack<T>(Transform parent = null, string packageName = null) where T : IBaseRenderPanel, new();
/// <summary>
/// 执行面板的出栈操作此操作会执行面板的OnExit方法
/// </summary>
void PopStack();
/// <summary>
/// 执行面板的出栈操作此操作会执行面板的OnExit方法
/// </summary>
void PopQueue<T>() where T : IBaseRenderPanel, new();
/// <summary>
/// 面板全部出栈此操作会执行面板的OnExit方法
/// </summary>
void PopAll();
/// <summary>
/// 返回存储面板实例的字典
/// </summary>
/// <returns></returns>
Dictionary<string, IBaseRenderPanel> Get_Dic();
IBaseRenderPanel GetPanel(string PanelName);
}
/// <summary>
/// 面板管理器用栈来存储UI
/// </summary>
public class SpriteRendererSystem : AbstractSystem, ISpriteRenderSystem
{
/// <summary>
/// 存储普通UI面板
/// </summary>
private List<IBaseRenderPanel> queuePanel;
/// <summary>
/// 存储堆栈UI面板
/// </summary>
private Stack<IBaseRenderPanel> stackPanel;
/// <summary>
/// 存储所有UI信息的字典每个UI信息都会对应一个GameObject
/// </summary>
private Dictionary<string, IBaseRenderPanel> dicUI;
protected override void OnInit()
{
stackPanel = new Stack<IBaseRenderPanel>();
queuePanel = new List<IBaseRenderPanel>();
dicUI = new Dictionary<string, IBaseRenderPanel>();
}
/// <summary>
/// UI的入栈操作此操作会显示一个面板
/// </summary>
/// <param name="parent"></param>
/// <param name="packageName">非热更模式传null</param>
/// <typeparam name="T"></typeparam>
public async Task PushQueue<T>(string packageName, string prefabName, Transform parent = null)
where T : IBaseRenderPanel, new()
{
IBaseRenderPanel nextPanel = null;
if (!dicUI.ContainsKey(prefabName))
{
nextPanel = new T();
nextPanel.UIName = prefabName;
await nextPanel.InitializeAsync(this);
nextPanel.SetPanelParent(parent);
GameObject panelGo = await nextPanel.CreatePanel(packageName, prefabName);
///生成面板后,进行初始化操作
await nextPanel.InitializeAsync(panelGo);
dicUI.Add(prefabName, nextPanel);
}
else
{
for (int i = 0; i < queuePanel.Count; i++)
{
if (queuePanel[i].GetType().Name == prefabName)
{
return;
}
}
nextPanel = dicUI[prefabName];
}
queuePanel.Add(nextPanel);
nextPanel.OnEnter();
//TOOD
}
/// <summary>
/// UI的入栈操作此操作会显示一个面板
/// </summary>
/// <param name="parent"></param>
/// <param name="packageName">非热更模式传null</param>
/// <typeparam name="T"></typeparam>
public async Task PushStack<T>(Transform parent = null, string packageName = null)
where T : IBaseRenderPanel, new()
{
var prefabName = typeof(T).Name;
if (string.IsNullOrEmpty(prefabName))
{
prefabName = typeof(T).Name;
}
IBaseRenderPanel nextPanel = null;
if (!dicUI.ContainsKey(prefabName))
{
nextPanel = new T();
nextPanel.UIName = prefabName;
await nextPanel.InitializeAsync(this);
nextPanel.SetPanelParent(parent);
GameObject panelGo = await nextPanel.CreatePanel(packageName, prefabName);
///生成面板后,进行初始化操作
await nextPanel.InitializeAsync(panelGo);
dicUI.Add(prefabName, nextPanel);
}
else
{
foreach (var panel in stackPanel)
{
if (panel.GetType().Name == prefabName)
{
return;
}
}
nextPanel = dicUI[prefabName];
}
if (stackPanel.Count > 0)
{
stackPanel.Peek().OnExit();
}
stackPanel.Push(nextPanel);
nextPanel.OnEnter();
}
public void PopQueue<T>() where T : IBaseRenderPanel, new()
{
string panelName = typeof(T).Name;
for (int i = 0; i < queuePanel.Count; i++)
{
if (queuePanel[i].GetType().Name == panelName)
{
queuePanel[i].OnExit();
queuePanel.RemoveAt(i);
}
}
}
public void PopStack()
{
if (stackPanel.Count > 0)
{
stackPanel.Pop().OnExit();
}
if (stackPanel.Count > 0)
{
stackPanel.Peek().OnEnter();
}
}
public void PopAll()
{
while (stackPanel.Count > 0)
stackPanel.Pop().OnExit();
foreach (var panel in queuePanel)
{
panel.OnExit();
}
queuePanel.Clear();
}
public Dictionary<string, IBaseRenderPanel> Get_Dic()
{
if (dicUI.Count > 0)
{
return dicUI;
}
return null;
}
public IBaseRenderPanel GetPanel(string PanelName)
{
if (dicUI.ContainsKey(PanelName))
{
return dicUI[PanelName];
}
return null;
}
public override void Dispose()
{
PopAll();
stackPanel = null;
queuePanel = null;
dicUI = null;
}
}
}