一、UI栈
用栈来管理UI,方便回退。类似Android的Activity。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
/// <summary>
/// UI栈
/// </summary>
public sealed class UIStack
{
private static Stack<UIMonoBehaviour> stack = new Stack<UIMonoBehaviour>();
static UIStack()
{
SceneManager.sceneUnloaded += OnSceneUnloaded;
}
private static void OnSceneUnloaded(Scene scene)
{
Debug.Log("UIStack Clear");
Clear();
}
public static void Push(UIMonoBehaviour ui)
{
stack.Push(ui);
}
public static UIMonoBehaviour Pop()
{
if (stack.Count == 0)
return null;
var ui = stack.Pop();
return ui;
}
public static void Clear()
{
stack.Clear();
}
}
using UnityEngine;
/// <summary>
/// UI基类
/// </summary>
public class UIMonoBehaviour : GameEventBehaviour
{
//UI根节点
[SerializeField]
private GameObject root;
// UI是否激活
public bool IsActive()
{
if (!isActiveAndEnabled)
return false;
if (root == null)
return gameObject.activeInHierarchy;
return root.activeInHierarchy;
}
// 设置UI激活状态
public void SetActive(bool value)
{
if (root == null)
gameObject.SetActive(value);
else
root.SetActive(value);
}
// 切换激活状态
public void SwitchActive()
{
if (IsActive())
Hide();
else
Show();
}
// 显示UI
public void Show()
{
SetActive(true);
OnShow();
}
// 回退显示
private void BackShow()
{
SetActive(true);
OnBackShow();
}
// 隐藏UI
public void Hide()
{
SetActive(false);
OnHide();
}
// 隐藏当前UI并入栈
public void HidePush()
{
Hide();
UIStack.Push(this);
}
// 隐藏当前UI并返回上级UI
public void HideBack()
{
Hide();
var ui = UIStack.Pop();
if (ui != null)
ui.BackShow();
}
// 判断UI是否已销毁
public bool IsDestroyed()
{
return this == null;
}
// 显示回调
protected virtual void OnShow() { }
// 回退显示回调
protected virtual void OnBackShow() { }
// 隐藏回调
protected virtual void OnHide() { }
}