245 lines
7.2 KiB
C#
245 lines
7.2 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Threading.Tasks;
|
||
using Kill.Managers;
|
||
using Kill.Network;
|
||
using Kill.UI.Components;
|
||
using UnityEngine;
|
||
|
||
namespace Kill.UI
|
||
{
|
||
public class UIManager : MonoBehaviour
|
||
{
|
||
public enum PageName
|
||
{
|
||
nullPage = 0,
|
||
loginPage=1,
|
||
safetylearningPage=2,
|
||
homePage=3,
|
||
connectDevicePage=4,
|
||
deviceInfoPage=5
|
||
}
|
||
[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=action;
|
||
}
|
||
RegisterBackAction(action);
|
||
|
||
}
|
||
public void RecoverBackAction()
|
||
{
|
||
if(backAction!=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;
|
||
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;
|
||
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;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 打开子页面(自动注册返回事件)
|
||
/// </summary>
|
||
public void OpenSubPage(PageName pageName, Action backAction)
|
||
{
|
||
OpenPage(pageName, backAction, false);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 打开主页面(双击返回退出)
|
||
/// </summary>
|
||
public void OpenMainPage(PageName pageName)
|
||
{
|
||
OpenPage(pageName, null, true);
|
||
}
|
||
|
||
}
|
||
}
|
||
|