当前位置:网站首页>Unity_Stack<T>()的应用(多个次级界面后的返回逻辑)
Unity_Stack<T>()的应用(多个次级界面后的返回逻辑)
2022-08-10 18:15:00 【云小川】
主要是利用Stack<T>();
堆栈(Stack)代表了一个后进先出的对象集合。
当需要对各项进行后进先出的访问时,则使用堆栈。
当在列表中添加一项,称为推入元素,
增加对象时要压入(push)
当从列表中移除一项时,称为弹出元素。
删除对象时要弹出(pop)
Stack 类的方法和属性
Count,代表了Stack中的元素个数
Clear(),清除所有Stack中的元素
Contains(Obj),判断obj(代表元素)是否存在于stack中
Peek(),返回在 Stack 的顶部的对象,但不移除它
Pop(),移除并返回在 Stack 的顶部的对象
Push( obj ),向 Stack 的顶部添加一个对象
ToArray(),复制所有的stack元素到一个数组中
1.使用的单利类
using UnityEngine;
/// <summary>
/// 通用Mono单例模板
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
private static T ms_instance;
public static T Instance
{
get
{
if (ms_instance == null)
{
ms_instance = Instantiate();
}
return ms_instance;
}
}
protected static T Instantiate()
{
if (ms_instance != null) return ms_instance;
// 在场景中查找T类型的Mono类
ms_instance = (T)FindObjectOfType(typeof(T));
if (FindObjectsOfType(typeof(T)).Length > 1)
{
return ms_instance;
}
if (ms_instance != null) return ms_instance;
// 创建GameObject实例
var singleton = new GameObject("[Singleton]" + typeof(T).Name);
DontDestroyOnLoad(singleton); // 设置GameObject不被销毁
if (singleton == null) return ms_instance;
// 添加Mono单例脚本
ms_instance = singleton.AddComponent<T>();
// 初始化单例
ms_instance.InitSingleton();
return ms_instance;
}
protected virtual void InitSingleton()
{
}
/// <summary>
/// 使用预制体实例化时创建单例
/// </summary>
protected virtual void Awake()
{
if (ms_instance == null)
{
ms_instance = this as T;
// 初始化单例
InitSingleton();
}
else
{
// 如果已经存在实例,则需要销毁当前的GameObject
GameObject.Destroy(this.gameObject);
}
}
protected virtual void OnApplicationQuit()
{
ms_instance = null;
// 销毁GameObject
GameObject.Destroy(this.gameObject);
}
}
2.逻辑类
using System.Collections.Generic;
public class UIBackManage : MonoSingleton<UIBackManage>
{
public delegate void OnBackDelegate();
Stack<OnBackDelegate> _OnBackStack = new Stack<OnBackDelegate>();
/// <summary>
/// 注册 (向 Stack 的顶部添加一个对象)
/// </summary>
/// <param name="cb"></param>
public void PushOnBack(OnBackDelegate cb)
{
_OnBackStack.Push(cb);
}
/// <summary>
/// 移除并返回在 Stack 的顶部的对象
/// </summary>
public void PopOnBack()
{
if (_OnBackStack.Count > 0)
{
_OnBackStack.Pop();
}
}
public void ClearOnBackStack()
{
_OnBackStack.Clear();
}
/// <summary>
/// 使用返回 (移除并返回在 Stack 的顶部的对象)
/// </summary>
public void OnBack()
{
if (_OnBackStack.Count > 0)
{
OnBackDelegate BD = _OnBackStack.Pop();
if (BD != null)
{
BD();
}
}
}
}
3.下面是 三个UI 相互 返回 调用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// UI 1
/// </summary>
public class Test02 : MonoSingleton<Test02>
{
public Button Fanhui;
public Button XiayiGe;
public GameObject MaskGo;
void Start()
{
Fanhui.onClick.AddListener(OnFanhui);
XiayiGe.onClick.AddListener(OnXiayiGe);
}
void OnEnable()
{
}
public void SetSteat(bool bo)
{
MaskGo.SetActive(bo);
}
public void OnFanhui()
{
UIBackManage.Instance.OnBack();
MaskGo.SetActive(false);
}
public void OnXiayiGe()
{
UIBackManage.Instance.PushOnBack(() => { SetSteat(true); });
Test01.Instance.SetSteat(true);
MaskGo.SetActive(false);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// UI 1
/// </summary>
public class Test02 : MonoSingleton<Test02>
{
public Button Fanhui;
public Button XiayiGe;
public GameObject MaskGo;
void Start()
{
Fanhui.onClick.AddListener(OnFanhui);
XiayiGe.onClick.AddListener(OnXiayiGe);
}
void OnEnable()
{
}
public void SetSteat(bool bo)
{
MaskGo.SetActive(bo);
}
public void OnFanhui()
{
UIBackManage.Instance.OnBack();
MaskGo.SetActive(false);
}
public void OnXiayiGe()
{
UIBackManage.Instance.PushOnBack(() => { SetSteat(true); });
Test03.Instance.SetSteat(true);
MaskGo.SetActive(false);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// UI 3
/// </summary>
public class Test03 : MonoSingleton<Test03>
{
public Button Fanhui;
public Button XiayiGe;
public GameObject MaskGo;
void Start()
{
Fanhui.onClick.AddListener(OnFanhui);
XiayiGe.onClick.AddListener(OnXiayiGe);
}
void OnEnable()
{
}
public void SetSteat(bool bo)
{
MaskGo.SetActive(bo);
}
public void OnFanhui()
{
UIBackManage.Instance.OnBack();
MaskGo.SetActive(false);
}
public void OnXiayiGe()
{
UIBackManage.Instance.PushOnBack(() => { SetSteat(true); });
Test01.Instance.SetSteat(true);
MaskGo.SetActive(false);
}
}
二:以上 方式 适用于 一个UI接下一个UI 的返回 方式
如果返回按钮 在最顶上呢,只有一个返回按钮时 则不适用,
方法:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// ui1
/// </summary>
public class Test01 : MonoSingleton<Test01>
{
//public Button Fanhui;
public Button XiayiGe;
public GameObject MaskGo;
void Start()
{
XiayiGe.onClick.AddListener(OnXiayiGe);
}
void OnEnable()
{
}
public void SetSteat(bool bo)
{
MaskGo.SetActive(bo);
}
/// <summary>
/// 打开 下一个UI(打开下一个UI时,就把关闭下一个UI和返回当前UI 的操作都注册了)
/// </summary>
public void OnXiayiGe()
{
UIBackManage.Instance.PushOnBack(() => {
Test02.Instance.SetSteat(false);//注册
SetSteat(true);//注册
});
Test02.Instance.SetSteat(true);//打开 下一个UI
MaskGo.SetActive(false);//关闭当前UI
}
}
返回按钮代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 返回按钮
/// </summary>
public class FanHui : MonoSingleton<FanHui>
{
public Button Fanhui_;
void Start()
{
Fanhui_.onClick.AddListener(OnFanhui);
}
public void OnFanhui()
{
UIBackManage.Instance.OnBack();
}
}
边栏推荐
猜你喜欢
随机推荐
机器人控制器编程实践指导书旧版-实践八 机器人综合设计
企业如何通过北森HR SaaS 自动化管理员工账号生命周期
Toronto Research Chemicals霉菌毒素分析丨T2 四醇
定时器循环展示数组
Interpretation of ZLMediaKit server source code---RTSP push and pull
Making Pre-trained Language Models Better Few-Shot Learners
Consul Introduction and Installation
NPDP|传统行业产品经理如何进行能力提升?
运维如何学习、自我提升价值?
Toronto Research Chemicals 对乙酰氧基苯乙酮说明书
接口测试进阶接口脚本使用—apipost(预/后执行脚本)
Toronto Research Chemicals萜烯分析丨(+)-柠檬烯
关于技术分享的思考
Toronto Research Chemicals霉菌毒素分析丨伏马菌素B2
机器人控制器编程整理汇总-辞旧迎新-
CSV(Comma-Separate-Values)逗号分隔值文件
pyspark列合并为一行
MySql main performance indicators description
Intelligent bid strategy how to affect advertising effectiveness?
关于奉加微PHY62xx系列如何选型?PHY6222/PHY6212/PHY6252