killapp/Assets/Scripts/UI/UIManager.cs
“虞渠成” 696b508187 debug
2026-06-12 16:07:27 +08:00

280 lines
8.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<Page> 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;
}
/// <summary>
/// 注册返回事件
/// </summary>
public void RegisterBackAction(Action action)
{
backAction = action;
}
Action lastBackAction=null;
public void AddBackAction(Action action)
{
if(backAction!=null)
{
lastBackAction=backAction;
}
RegisterBackAction(action);
}
public void RecoverBackAction()
{
if(lastBackAction!=null)
{
RegisterBackAction(lastBackAction);
}
lastBackAction=null;
}
/// <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;
}
// 如果有注册的返回事件,先执行
if (backAction != null)
{
Debug.Log("执行注册返回");
var action = backAction;
action.Invoke();
return;
}
// 没有返回事件时,按主页面处理(双击退出)
HandleMainPageBack();
}
/// <summary>
/// 处理主页面返回(双击退出)
/// </summary>
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<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
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;
if(isFirstTime)
{
nowPage.GetComponent<HomePageCtrl>().LockButtonPlane.SetActive(true);
}
break;
case PageName.connectDevicePage:
assetName = "connectDevicePage.prefab";
prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
case PageName.deviceInfoPage:
assetName = "deviceInfoPage.prefab";
prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
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;
}
}
/// <summary>
/// 打开子页面(自动注册返回事件)
/// </summary>
public void OpenSubPage(PageName pageName, Action backAction)
{
OpenPage(pageName, backAction, false);
}
/// <summary>
/// 打开主页面(双击返回退出)
/// </summary>
public void OpenMainPage(PageName pageName)
{
OpenPage(pageName, null, true);
}
void OnApplicationPause(bool pause)
{
isFirstTime=true;
}
}
}