/**************************************************************************** * Copyright (c) 2015 - 2022 liangxiegame UNDER MIT License * * http://qframework.cn * https://github.com/liangxiegame/QFramework * https://gitee.com/liangxiegame/QFramework ****************************************************************************/ using System; using System.Collections; using UnityEngine; using UnityEngine.UIElements; namespace QFramework { #if UNITY_EDITOR [ClassAPI("08.UIKit", "UIKit", 0, "UIKit")] [APIDescriptionCN("界面管理方案")] [APIDescriptionEN("UI Managements Solution")] #endif public class UIKit { public static UIKitConfig Config = new UIKitConfig(); /// /// UIPanel 管理(数据结构) /// public static UIPanelTable Table { get; } = new UIPanelTable(); #if UNITY_EDITOR [MethodAPI] [APIDescriptionCN("打开界面")] [APIDescriptionEN("Open UI Panel")] [APIExampleCode(@" UIKit.OpenPanel(); UIKit.OpenPanel(""UIHomePanel""); UIKit.OpenPanel(prefabName:""UIHomePanelPrefab""); UIKit.OpenPanel(new UIHomePanelData() { OpenFrom = ""GameOverPanel"" }); UIKit.OpenPanel(UILevel.Common); ")] #endif public static T OpenPanel(PanelOpenType panelOpenType, UILevel canvasLevel = UILevel.Common, IUIData uiData = null, string assetBundleName = null, string prefabName = null) where T : UIPanel { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.OpenType = panelOpenType; panelSearchKeys.Level = canvasLevel; panelSearchKeys.PanelType = typeof(T); panelSearchKeys.AssetBundleName = assetBundleName; panelSearchKeys.GameObjName = prefabName; panelSearchKeys.UIData = uiData; T retPanel = UIManager.Instance.OpenUI(panelSearchKeys) as T; panelSearchKeys.Recycle2Cache(); return retPanel; } private static WaitForEndOfFrame mWaitForEndOfFrame = new WaitForEndOfFrame(); #if UNITY_EDITOR [MethodAPI] [APIDescriptionCN("异步打开界面")] [APIDescriptionEN("Open UI Panel Async")] [APIExampleCode(@" yield return UIKit.OpenPanelAsync(); // ActionKit Mode UIKit.OpenPanelAsync().ToAction().Start(this); ")] #endif public static IEnumerator OpenPanelAsync(UILevel canvasLevel = UILevel.Common, IUIData uiData = null, string assetBundleName = null, string prefabName = null) where T : UIPanel { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.OpenType = PanelOpenType.Single; panelSearchKeys.Level = canvasLevel; panelSearchKeys.PanelType = typeof(T); panelSearchKeys.AssetBundleName = assetBundleName; panelSearchKeys.GameObjName = prefabName; panelSearchKeys.UIData = uiData; bool loaded = false; UIManager.Instance.OpenUIAsync(panelSearchKeys, panel => { loaded = true; }); while (!loaded) { yield return mWaitForEndOfFrame; } panelSearchKeys.Recycle2Cache(); } public static IEnumerator OpenPanelAsync(Type type, UILevel canvasLevel = UILevel.Common, IUIData uiData = null, string assetBundleName = null, string prefabName = null) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.OpenType = PanelOpenType.Single; panelSearchKeys.Level = canvasLevel; panelSearchKeys.PanelType = type; panelSearchKeys.AssetBundleName = assetBundleName; panelSearchKeys.GameObjName = prefabName; panelSearchKeys.UIData = uiData; bool loaded = false; UIManager.Instance.OpenUIAsync(panelSearchKeys, panel => { loaded = true; }); while (!loaded) { yield return mWaitForEndOfFrame; } panelSearchKeys.Recycle2Cache(); } public static T OpenPanel(UILevel canvasLevel = UILevel.Common, IUIData uiData = null, string assetBundleName = null, string prefabName = null) where T : UIPanel { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.OpenType = PanelOpenType.Single; panelSearchKeys.Level = canvasLevel; panelSearchKeys.PanelType = typeof(T); panelSearchKeys.AssetBundleName = assetBundleName; panelSearchKeys.GameObjName = prefabName; panelSearchKeys.UIData = uiData; T retPanel = UIManager.Instance.OpenUI(panelSearchKeys) as T; panelSearchKeys.Recycle2Cache(); return retPanel; } public static T OpenPanel(IUIData uiData, PanelOpenType panelOpenType = PanelOpenType.Single, string assetBundleName = null, string prefabName = null) where T : UIPanel { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.OpenType = panelOpenType; panelSearchKeys.Level = UILevel.Common; panelSearchKeys.PanelType = typeof(T); panelSearchKeys.AssetBundleName = assetBundleName; panelSearchKeys.GameObjName = prefabName; panelSearchKeys.UIData = uiData; T retPanel = UIManager.Instance.OpenUI(panelSearchKeys) as T; panelSearchKeys.Recycle2Cache(); return retPanel; } #if UNITY_EDITOR [MethodAPI] [APIDescriptionCN("关闭界面")] [APIDescriptionEN("Close Panel")] [APIExampleCode(@" UIKit.ClosePanel(); UIKit.ClosePanel(""UIHomePanel""); ")] #endif public static void ClosePanel() where T : UIPanel { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.PanelType = typeof(T); UIManager.Instance.CloseUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } public static void ClosePanel(Type type) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.PanelType = type; UIManager.Instance.CloseUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } #if UNITY_EDITOR [MethodAPI] [APIDescriptionCN("显示界面")] [APIDescriptionEN("Show Panel")] [APIExampleCode(@" UIKit.ShowPanel(); UIKit.ShowPanel(""UIHomePanel""); ")] #endif public static void ShowPanel() where T : UIPanel { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.PanelType = typeof(T); UIManager.Instance.ShowUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } #if UNITY_EDITOR [MethodAPI] [APIDescriptionCN("隐藏界面")] [APIDescriptionEN("Hide Panel")] [APIExampleCode(@" UIKit.HidePanel(); UIKit.HidePanel(""UIHomePanel""); ")] #endif public static void HidePanel() where T : UIPanel { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.PanelType = typeof(T); UIManager.Instance.HideUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } public static void HidePanel(Type type) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.PanelType = type; UIManager.Instance.HideUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } #if UNITY_EDITOR [MethodAPI] [APIDescriptionCN("关闭全部界面")] [APIDescriptionEN("Close All Panel")] [APIExampleCode(@" UIKit.CloseAllPanel(); ")] #endif public static void CloseAllPanel() { UIManager.Instance.CloseAllUI(); } #if UNITY_EDITOR [MethodAPI] [APIDescriptionCN("隐藏全部界面")] [APIDescriptionEN("Hide All Panel")] [APIExampleCode(@" UIKit.HideAllPanel(); ")] #endif public static void HideAllPanel() { UIManager.Instance.HideAllUI(); } #if UNITY_EDITOR [MethodAPI] [APIDescriptionCN("获取界面")] [APIDescriptionEN("Get Panel")] [APIExampleCode(@" var homePanel = UIKit.GetPanel(); UIKit.GetPanel(""UIHomePanel""); ")] #endif public static T GetPanel() where T : UIPanel { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.PanelType = typeof(T); var retPanel = UIManager.Instance.GetUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); return retPanel as T; } public static UIPanel GetPanel(Type type) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.PanelType = type; var retPanel = UIManager.Instance.GetUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); return retPanel; } #region 给脚本层用的 api public static UIPanel GetPanel(string panelName) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.GameObjName = panelName; var retPanel = UIManager.Instance.GetUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); return retPanel; } public static UIPanel OpenPanel(string panelName, UILevel level = UILevel.Common, string assetBundleName = null) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.Level = level; panelSearchKeys.AssetBundleName = assetBundleName; panelSearchKeys.GameObjName = panelName; var retPanel = UIManager.Instance.OpenUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); return retPanel as UIPanel; } public static void ClosePanel(string panelName) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.GameObjName = panelName; UIManager.Instance.CloseUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } public static void ClosePanel(UIPanel panel) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.Panel = panel; UIManager.Instance.CloseUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } public static void ShowPanel(string panelName) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.GameObjName = panelName; UIManager.Instance.ShowUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } public static void HidePanel(string panelName) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.GameObjName = panelName; UIManager.Instance.HideUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } #endregion #if UNITY_EDITOR [PropertyAPI] [APIDescriptionCN("UIKit 界面根节点")] [APIDescriptionEN("UIKit Root GameObject")] [APIExampleCode(@" UIKit.Root.SetResolution(1920,1080,0); ")] #endif public static UIRoot Root => Config.Root; #if UNITY_EDITOR [PropertyAPI] [APIDescriptionCN("UIKit 界面堆栈")] [APIDescriptionEN("UIKit Panel Stack")] [APIExampleCode(@" UIKit.Stack.Push(UIKit.OpenPanel(); // push and close uihomepanel UIKit.Stack.Pop() // pop and open uihomepanel ")] #endif public static UIPanelStack Stack { get; } = new UIPanelStack(); #if UNITY_EDITOR [MethodAPI] [APIDescriptionCN("关闭掉当前界面,返回上一个 Push 过的界面")] [APIDescriptionEN("Close Current Panel and Back to previous pushed Panel")] [APIExampleCode(@" UIKit.Stack.Push(UIKit.OpenPanel()); var basicPanel = UIKit.OpenPanel(); UIKit.Back(basicPanel); // UIHomePanel Opened ")] #endif public static void Back(string currentPanelName) { if (!string.IsNullOrEmpty(currentPanelName)) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.GameObjName = currentPanelName; UIManager.Instance.CloseUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } Stack.Pop(); } public static void Back(UIPanel currentPanel) { if (currentPanel != null) { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.GameObjName = currentPanel.name; UIManager.Instance.CloseUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); } Stack.Pop(); } public static void Back() { var panelSearchKeys = PanelSearchKeys.Allocate(); panelSearchKeys.PanelType = typeof(T); UIManager.Instance.CloseUI(panelSearchKeys); panelSearchKeys.Recycle2Cache(); Stack.Pop(); } } }