killapp/Assets/Scripts/UI/UIManager.cs

280 lines
8.7 KiB
C#
Raw Normal View History

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