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
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|