Files
plugin-library/Assets/00.StaryEvo/Runtime/Tool/PanelSystem/Manager/PanelSystem.cs
stary 65548d04c7
All checks were successful
Plugin Library CI / publish (00.BuildOriginality) (push) Successful in 7s
Plugin Library CI / publish (00.StaryEvo) (push) Successful in 20s
Plugin Library CI / publish (00.StaryEvoTools) (push) Successful in 21s
Plugin Library CI / publish (01.HybridCLR) (push) Successful in 11s
Plugin Library CI / publish (02.InformationSave) (push) Successful in 5s
Plugin Library CI / publish (03.YooAsset) (push) Successful in 42s
Plugin Library CI / publish (04.AudioCore) (push) Successful in 6s
Plugin Library CI / publish (05.TableTextConversion) (push) Successful in 7s
Plugin Library CI / publish (06.UIFarme) (push) Successful in 26s
Plugin Library CI / publish (07.RKTools) (push) Successful in 6s
Plugin Library CI / publish (10.StoryEditor) (push) Successful in 3s
Plugin Library CI / publish (10.XNode) (push) Successful in 4s
Plugin Library CI / publish (12.WeixinMinigame) (push) Successful in 1m4s
Plugin Library CI / publish (08.UniTask) (push) Successful in 7s
Plugin Library CI / publish (09.CodeChecker) (push) Successful in 17s
Plugin Library CI / publish (11.PointCloudTools) (push) Successful in 3s
111
2026-05-15 13:56:38 +08:00

325 lines
9.8 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 IPanelSystem : ISystem
{
/// <summary>
/// 资源加载器用于切换不同的资源加载方式YooAsset、Resources等
/// </summary>
IAssetLoader AssetLoader { get; set; }
/// <summary>
/// UI的入栈操作此操作会显示一个面板
/// </summary>
Task PushQueue<T>(string panelName=null,Transform parent = null, string packageName = null) where T : IBasePanel, new();
/// <summary>
/// UI的入栈操作此操作会显示一个面板
/// </summary>
Task PushStack<T>(string panelName=null,Transform parent = null, string packageName = null) where T : IBasePanel, new();
/// <summary>
/// 执行面板的出栈操作此操作会执行面板的OnExit方法
/// </summary>
void PopQueue<T>(string panelName=null) where T : IBasePanel, new();
void PopQueue<T>(T t, string panelName=null) where T : IBasePanel, new();
/// <summary>
/// 执行面板的出栈操作此操作会执行面板的OnExit方法
/// </summary>
void PopStack();
/// <summary>
/// 面板全部出栈此操作会执行面板的OnExit方法
/// </summary>
void PopAll();
/// <summary>
/// 事件发送
/// </summary>
/// <typeparam name="T"></typeparam>
public void SendPanelEvent<TEvent>(TEvent key) where TEvent : IConvertible;
/// <summary>
/// 事件发送
/// </summary>
/// <typeparam name="T"></typeparam>
public void SendPanelEvent<TEvent, Tvalue1>(TEvent key, Tvalue1 value) where TEvent : IConvertible;
/// <summary>
/// 事件发送
/// </summary>
/// <typeparam name="T"></typeparam>
public void SendPanelEvent<TEvent, Tvalue1, Tvalue2>(TEvent key, Tvalue1 value1, Tvalue2 value2)
where TEvent : IConvertible;
/// <summary>
/// 事件发送
/// </summary>
/// <typeparam name="T"></typeparam>
public void SendPanelEvent<TEvent, Tvlue1, Tvlue2, Tvlue3>(TEvent key, Tvlue1 value1, Tvlue2 vlue2,
Tvlue3 vlue3)
where TEvent : IConvertible;
/// <summary>
/// 返回存储面板实例的字典
/// </summary>
/// <returns></returns>
Dictionary<string, IBasePanel> Get_Dic();
IBasePanel GetPanel(string PanelName);
}
/// <summary>
/// 面板管理器用栈来存储UI
/// </summary>
public class PanelSystem : AbstractSystem, IPanelSystem
{
/// <summary>
/// 资源加载器
/// </summary>
public IAssetLoader AssetLoader { get; set; }
/// <summary>
/// 存储普通UI面板
/// </summary>
private List<IBasePanel> queuePanel;
/// <summary>
/// 存储堆栈UI面板
/// </summary>
private Stack<IBasePanel> stackPanel;
/// <summary>
/// 存储所有UI信息的字典每个UI信息都会对应一个GameObject
/// </summary>
private Dictionary<string, IBasePanel> dicUI;
public PanelSystem(IAssetLoader assetLoader)
{
this.AssetLoader = assetLoader;
}
protected override void OnInit()
{
stackPanel = new Stack<IBasePanel>();
queuePanel = new List<IBasePanel>();
dicUI = new Dictionary<string, IBasePanel>();
if (AssetLoader == null)
{
Debug.LogError("UnityEvo:AssetLoader is null, please set AssetLoader.");
}
}
/// <summary>
/// UI的入栈操作此操作会显示一个面板
/// </summary>
/// <param name="parent"></param>
/// <param name="packageName">非热更模式传null</param>
/// <typeparam name="T"></typeparam>
public async Task PushQueue<T>(string panelName=null, Transform parent = null, string packageName = null)
where T : IBasePanel, new()
{
var prefabName = typeof(T).Name;
if (string.IsNullOrEmpty(panelName))
{
panelName = typeof(T).Name;
}
IBasePanel nextPanel = null;
if (!dicUI.ContainsKey(panelName))
{
nextPanel = new T();
nextPanel.UIName = panelName;
await nextPanel.InitializeAsync(this);
nextPanel.SetPanelParent(parent);
GameObject panelGo = await nextPanel.CreatePanel(prefabName, packageName);
///生成面板后,进行初始化操作
await nextPanel.InitializeAsync(panelGo);
dicUI.Add(panelName, nextPanel);
}
else
{
for (int i = 0; i < queuePanel.Count; i++)
{
if (queuePanel[i].GetType().Name == panelName)
{
return;
}
}
nextPanel = dicUI[panelName];
}
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>(string panelName=null,Transform parent = null, string packageName = null) where T : IBasePanel, new()
{
var prefabName = typeof(T).Name;
if (string.IsNullOrEmpty(panelName))
{
panelName = typeof(T).Name;
}
IBasePanel nextPanel = null;
if (!dicUI.ContainsKey(panelName))
{
nextPanel = new T();
nextPanel.UIName = panelName;
await nextPanel.InitializeAsync(this);
nextPanel.SetPanelParent(parent);
GameObject panelGo = await nextPanel.CreatePanel(prefabName, packageName);
///生成面板后,进行初始化操作
await nextPanel.InitializeAsync(panelGo);
dicUI.Add(panelName, nextPanel);
}
else
{
foreach (var panel in stackPanel)
{
if (panel.GetType().Name == panelName)
{
return;
}
}
nextPanel = dicUI[panelName];
}
if(stackPanel.Count > 0)
{
stackPanel.Peek().OnExit();
}
stackPanel.Push(nextPanel);
nextPanel.OnEnter();
}
public void PopQueue<T>(string panelName=null) where T : IBasePanel, new()
{
if (string.IsNullOrEmpty(panelName))
{
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 PopQueue<T>(T t, string panelName = null) where T : IBasePanel, new()
{
PopQueue<T>(panelName);
}
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();
}
/// <summary>
/// 事件发送
/// </summary>
/// <typeparam name="T"></typeparam>
public void SendPanelEvent<TEvent>(TEvent key) where TEvent : IConvertible
{
this.SendEvent(key);
}
/// <summary>
/// 事件发送
/// </summary>
/// <typeparam name="T"></typeparam>
public void SendPanelEvent<TEvent, Tvalue1>(TEvent key, Tvalue1 value) where TEvent : IConvertible
{
this.SendEvent(key, value);
}
/// <summary>
/// 事件发送
/// </summary>
/// <typeparam name="T"></typeparam>
public void SendPanelEvent<TEvent, Tvalue1, Tvalue2>(TEvent key, Tvalue1 value1, Tvalue2 value2)
where TEvent : IConvertible
{
this.SendEvent(key, value1, value2);
}
/// <summary>
/// 事件发送
/// </summary>
/// <typeparam name="T"></typeparam>
public void SendPanelEvent<TEvent, Tvlue1, Tvlue2, Tvlue3>(TEvent key, Tvlue1 value1, Tvlue2 vlue2,
Tvlue3 vlue3)
where TEvent : IConvertible
{
this.SendEvent(key, value1, vlue2, vlue3);
}
public Dictionary<string, IBasePanel> Get_Dic()
{
if (dicUI.Count > 0)
{
return dicUI;
}
return null;
}
public IBasePanel GetPanel(string PanelName)
{
if (dicUI.ContainsKey(PanelName))
{
return dicUI[PanelName];
}
return null;
}
public override void Dispose()
{
PopAll();
stackPanel = null;
queuePanel = null;
dicUI = null;
}
}
}