using System; using System.Collections.Generic; using System.Threading.Tasks; using Kill.Managers; using Kill.Network; using Kill.UI.Components; using Kill.UI.Pages; using UnityEngine; namespace Kill.UI { public class UIManager : MonoBehaviour { public bool isFirstTime=true; public enum PageName { nullPage = 0, loginPage=1, safetylearningPage=2, homePage=3, connectDevicePage=4, deviceInfoPage=5, selfPage=6, videoPage=7, rankPage=8 } [System.Serializable] public struct Page { public PageName pageName; public string bundleName; } public static UIManager Instance; public List pages; public GameObject nowPage; public PageName nowPageName = PageName.nullPage; public Transform bg; // 返回事件管理 private Action backAction; private bool isMainPage = false; private float lastBackTime = 0f; private const float DOUBLE_BACK_INTERVAL = 1f; void Awake() { Instance = this; } void Update() { // 监听返回键(Android 物理返回键) if (Input.GetKeyDown(KeyCode.Escape)) { Debug.Log("返回键被按下"); OnBackPressed(); } } public Action GetBackAction() { return backAction; } /// /// 注册返回事件 /// public void RegisterBackAction(Action action) { backAction = action; } Action lastBackAction=null; public void AddBackAction(Action action) { if(backAction!=null) { lastBackAction=action; } RegisterBackAction(action); } public void RecoverBackAction() { if(backAction!=null) { RegisterBackAction(lastBackAction); } lastBackAction=null; } /// /// 清除返回事件 /// public void ClearBackAction() { backAction = null; } /// /// 设置当前是否为主页面 /// public void SetMainPage(bool isMain) { isMainPage = isMain; } /// /// 返回键处理 /// private void OnBackPressed() { if(LoadingUI.Instance.loadingPanel.activeSelf) { return; } // 如果有注册的返回事件,先执行 if (backAction != null) { Debug.Log("执行注册返回"); var action = backAction; action.Invoke(); return; } // 没有返回事件时,按主页面处理(双击退出) HandleMainPageBack(); } /// /// 处理主页面返回(双击退出) /// private void HandleMainPageBack() { Debug.Log("执行退出"); if (Time.time - lastBackTime < DOUBLE_BACK_INTERVAL) { // 退出应用 Application.Quit(); #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #endif } else { // 第一次返回,显示提示 lastBackTime = Time.time; ToastUI.Show("100037"); } } public async Task Init() { if (DataManager.Instance.token == "") { OpenPage(PageName.loginPage, null, false); } else { bool hasToken=await DataManager.Instance.TokenLogin(); if(hasToken) OpenPage(PageName.homePage, null, true); else OpenPage(PageName.loginPage); } } public async void OpenPage(PageName pageName, Action backAction = null, bool isMainPage = false) { Debug.Log("打开页面:" + pageName); // 清除之前的返回事件 ClearBackAction(); // 销毁旧页面 switch (nowPageName) { case PageName.nullPage: break; case PageName.loginPage: Destroy(nowPage); break; case PageName.homePage: DataManager.Instance.selectedDevice = HomePageCtrl.Instance.selectedDevice; Destroy(nowPage); break; default: Destroy(nowPage); break; } // 设置返回事件和主页面标记 if (backAction != null) { RegisterBackAction(backAction); } SetMainPage(isMainPage); int index = pages.FindIndex(x => x.pageName == pageName); switch (pageName) { case PageName.nullPage: break; case PageName.loginPage: string assetName = "loginPage.prefab"; GameObject prefab = await LoadRes.Instance.LoadAssetAsync(pages[index].bundleName, assetName); nowPage = Instantiate(prefab, bg); nowPageName = pageName; break; case PageName.safetylearningPage: assetName = "safetylearningPage.prefab"; prefab = await LoadRes.Instance.LoadAssetAsync(pages[index].bundleName, assetName); nowPage = Instantiate(prefab, bg); nowPageName = pageName; break; case PageName.homePage: assetName = "homePage.prefab"; prefab = await LoadRes.Instance.LoadAssetAsync(pages[index].bundleName, assetName); nowPage = Instantiate(prefab, bg); nowPageName = pageName; if(isFirstTime) { nowPage.GetComponent().LockButtonPlane.SetActive(true); } break; case PageName.connectDevicePage: assetName = "connectDevicePage.prefab"; prefab = await LoadRes.Instance.LoadAssetAsync(pages[index].bundleName, assetName); nowPage = Instantiate(prefab, bg); nowPageName = pageName; break; case PageName.deviceInfoPage: assetName = "deviceInfoPage.prefab"; prefab = await LoadRes.Instance.LoadAssetAsync(pages[index].bundleName, assetName); nowPage = Instantiate(prefab, bg); nowPageName = pageName; break; case PageName.selfPage: assetName = "selfPage.prefab"; prefab = await LoadRes.Instance.LoadAssetAsync(pages[index].bundleName, assetName); nowPage = Instantiate(prefab, bg); nowPageName = pageName; break; case PageName.videoPage: assetName = "videoPage.prefab"; prefab = await LoadRes.Instance.LoadAssetAsync(pages[index].bundleName, assetName); nowPage = Instantiate(prefab, bg); nowPageName = pageName; break; case PageName.rankPage: assetName = "rankPage.prefab"; prefab = await LoadRes.Instance.LoadAssetAsync(pages[index].bundleName, assetName); nowPage = Instantiate(prefab, bg); nowPageName = pageName; break; } } /// /// 打开子页面(自动注册返回事件) /// public void OpenSubPage(PageName pageName, Action backAction) { OpenPage(pageName, backAction, false); } /// /// 打开主页面(双击返回退出) /// public void OpenMainPage(PageName pageName) { OpenPage(pageName, null, true); } void OnApplicationPause(bool pause) { isFirstTime=true; } } }