killapp/Assets/Scripts/UI/UIManager.cs

211 lines
6.1 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;
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
{
public enum PageName
{
nullPage = 0,
2026-04-24 16:57:44 +08:00
loginPage=1,
safetylearningPage=2,
homePage=3,
connectDevicePage=4
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;
}
/// <summary>
/// 清除返回事件
/// </summary>
public void ClearBackAction()
{
backAction = null;
}
/// <summary>
/// 设置当前是否为主页面
/// </summary>
public void SetMainPage(bool isMain)
{
isMainPage = isMain;
}
/// <summary>
/// 返回键处理
/// </summary>
private void OnBackPressed()
{
// 如果有注册的返回事件,先执行
if (backAction != null)
{
var action = backAction;
action.Invoke();
return;
}
// 没有返回事件时,按主页面处理(双击退出)
HandleMainPageBack();
}
/// <summary>
/// 处理主页面返回(双击退出)
/// </summary>
private void HandleMainPageBack()
{
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-24 16:57:44 +08:00
await DataManager.Instance.TokenLogin();
OpenPage(PageName.homePage, null, true);
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-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;
break;
case PageName.connectDevicePage:
assetName = "connectDevicePage.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);
}
2025-11-18 09:18:48 +08:00
}
}