using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; namespace Stary.Evo.UIFarme { public interface ISpriteRenderSystem : ISystem { /// /// UI的入栈操作,此操作会显示一个面板 /// Task PushQueue(string prefabName, string packageName = null, Transform parent = null,BaseRenderPanel.UITweenType tweenType = BaseRenderPanel.UITweenType.Fade); Task PushQueue(string packageName = null, Transform parent = null,BaseRenderPanel.UITweenType tweenType = BaseRenderPanel.UITweenType.Fade) where T : IBaseRenderPanel, new(); Task PushStack(string prefabName, string packageName = null, Transform parent = null); /// /// UI的入栈操作,此操作会显示一个面板 /// Task PushStack(Transform parent = null, string packageName = null) where T : IBaseRenderPanel, new(); /// /// 执行面板的出栈操作,此操作会执行面板的OnExit方法 /// void PopStack(); /// /// 执行面板的出栈操作,此操作会执行面板的OnExit方法 /// void PopQueue(string panelName,BaseRenderPanel.UITweenType tweenType = BaseRenderPanel.UITweenType.Fade); void PopQueue(BaseRenderPanel.UITweenType tweenType = BaseRenderPanel.UITweenType.Fade) where T : IBaseRenderPanel, new(); /// /// 面板全部出栈此操作会执行面板的OnExit方法 /// void PopAll(); /// /// 事件发送 /// /// public void SendPanelEvent(TEvent key) where TEvent : IConvertible; /// /// 事件发送 /// /// public void SendPanelEvent(TEvent key, Tvalue1 value) where TEvent : IConvertible; /// /// 事件发送 /// /// public void SendPanelEvent(TEvent key, Tvalue1 value1, Tvalue2 value2) where TEvent : IConvertible; /// /// 事件发送 /// /// public void SendPanelEvent(TEvent key, Tvlue1 value1, Tvlue2 vlue2, Tvlue3 vlue3) where TEvent : IConvertible; /// /// 返回存储面板实例的字典 /// /// Dictionary Get_Dic(); IBaseRenderPanel GetPanel(string PanelName); } /// /// 面板管理器,用栈来存储UI /// public class SpriteRendererSystem : AbstractSystem, ISpriteRenderSystem { /// /// 存储普通UI面板 /// private List queuePanel; /// /// 存储堆栈UI面板 /// private Stack stackPanel; /// /// 存储所有UI信息的字典,每个UI信息都会对应一个GameObject /// private Dictionary dicUI; protected override void OnInit() { stackPanel = new Stack(); queuePanel = new List(); dicUI = new Dictionary(); } /// /// UI的入栈操作,此操作会显示一个面板 /// /// /// 非热更模式传null /// public async Task PushQueue(string prefabName, string packageName = null, Transform parent = null,BaseRenderPanel.UITweenType tweenType = BaseRenderPanel.UITweenType.Fade) { IBaseRenderPanel nextPanel = null; if (!dicUI.ContainsKey(prefabName)) { nextPanel = new BaseRenderPanel(); nextPanel.UIName = prefabName; await nextPanel.InitializeAsync(this); nextPanel.SetPanelParent(parent); nextPanel.TweenType = tweenType; 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 } /// /// UI的入栈操作,此操作会显示一个面板 /// /// /// 非热更模式传null /// public async Task PushQueue(string packageName = null, Transform parent = null,BaseRenderPanel.UITweenType tweenType = BaseRenderPanel.UITweenType.Fade) where T : IBaseRenderPanel, new() { var prefabName = typeof(T).Name; IBaseRenderPanel nextPanel = null; if (!dicUI.ContainsKey(prefabName)) { nextPanel = new T(); await nextPanel.InitializeAsync(this); nextPanel.SetPanelParent(parent); nextPanel.TweenType = tweenType; GameObject panelGo = await nextPanel.CreatePanel(packageName, nextPanel.UIName); ///生成面板后,进行初始化操作 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 } /// /// UI的入栈操作,此操作会显示一个面板 /// /// /// 非热更模式传null /// public async Task PushStack(string prefabName, string packageName = null, Transform parent = null) { IBaseRenderPanel nextPanel = null; if (!dicUI.ContainsKey(prefabName)) { nextPanel = new BaseRenderPanel(); 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(); } /// /// UI的入栈操作,此操作会显示一个面板 /// /// /// 非热更模式传null /// public async Task PushStack(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(); await nextPanel.InitializeAsync(this); nextPanel.SetPanelParent(parent); GameObject panelGo = await nextPanel.CreatePanel(packageName, nextPanel.UIName); ///生成面板后,进行初始化操作 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(string panelName,BaseRenderPanel.UITweenType tweenType = BaseRenderPanel.UITweenType.Fade) { for (int i = 0; i < queuePanel.Count; i++) { if (queuePanel[i].UIName == panelName) { queuePanel[i].TweenType = tweenType; queuePanel[i].OnExit(); queuePanel.RemoveAt(i); } } } public void PopQueue(BaseRenderPanel.UITweenType tweenType = BaseRenderPanel.UITweenType.Fade) where T : IBaseRenderPanel, new() { for (int i = 0; i < queuePanel.Count; i++) { if (queuePanel[i].GetType().Name == typeof(T).Name) { queuePanel[i].TweenType = tweenType; 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 void SendPanelEvent(TEvent key) where TEvent : IConvertible { this.SendEvent(key); } /// /// 事件发送 /// /// public void SendPanelEvent(TEvent key, Tvalue1 value) where TEvent : IConvertible { this.SendEvent(key, value); } /// /// 事件发送 /// /// public void SendPanelEvent(TEvent key, Tvalue1 value1, Tvalue2 value2) where TEvent : IConvertible { this.SendEvent(key, value1, value2); } /// /// 事件发送 /// /// public void SendPanelEvent(TEvent key, Tvlue1 value1, Tvlue2 vlue2, Tvlue3 vlue3) where TEvent : IConvertible { this.SendEvent(key, value1, vlue2, vlue3); } public Dictionary 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; } } }