• Unity_Stack<T>()的应用(多个次级界面后的返回逻辑)


    主要是利用Stack();

    堆栈(Stack)代表了一个后进先出的对象集合。

    当需要对各项进行后进先出的访问时,则使用堆栈。

    当在列表中添加一项,称为推入元素,

    增加对象时要压入(push)
    当从列表中移除一项时,称为弹出元素。

    删除对象时要弹出(pop)
    Stack 类的方法和属性
    Count,代表了Stack中的元素个数

    Clear(),清除所有Stack中的元素

    Contains(Obj),判断obj(代表元素)是否存在于stack中

    Peek(),返回在 Stack 的顶部的对象,但不移除它

    Pop(),移除并返回在 Stack 的顶部的对象

    Push( obj ),向 Stack 的顶部添加一个对象

    ToArray(),复制所有的stack元素到一个数组中

    1.使用的单利类

    1. using UnityEngine;
    2. ///
    3. /// 通用Mono单例模板
    4. ///
    5. ///
    6. public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
    7. {
    8. private static T ms_instance;
    9. public static T Instance
    10. {
    11. get
    12. {
    13. if (ms_instance == null)
    14. {
    15. ms_instance = Instantiate();
    16. }
    17. return ms_instance;
    18. }
    19. }
    20. protected static T Instantiate()
    21. {
    22. if (ms_instance != null) return ms_instance;
    23. // 在场景中查找T类型的Mono类
    24. ms_instance = (T)FindObjectOfType(typeof(T));
    25. if (FindObjectsOfType(typeof(T)).Length > 1)
    26. {
    27. return ms_instance;
    28. }
    29. if (ms_instance != null) return ms_instance;
    30. // 创建GameObject实例
    31. var singleton = new GameObject("[Singleton]" + typeof(T).Name);
    32. DontDestroyOnLoad(singleton); // 设置GameObject不被销毁
    33. if (singleton == null) return ms_instance;
    34. // 添加Mono单例脚本
    35. ms_instance = singleton.AddComponent();
    36. // 初始化单例
    37. ms_instance.InitSingleton();
    38. return ms_instance;
    39. }
    40. protected virtual void InitSingleton()
    41. {
    42. }
    43. ///
    44. /// 使用预制体实例化时创建单例
    45. ///
    46. protected virtual void Awake()
    47. {
    48. if (ms_instance == null)
    49. {
    50. ms_instance = this as T;
    51. // 初始化单例
    52. InitSingleton();
    53. }
    54. else
    55. {
    56. // 如果已经存在实例,则需要销毁当前的GameObject
    57. GameObject.Destroy(this.gameObject);
    58. }
    59. }
    60. protected virtual void OnApplicationQuit()
    61. {
    62. ms_instance = null;
    63. // 销毁GameObject
    64. GameObject.Destroy(this.gameObject);
    65. }
    66. }

    2.逻辑类

    1. using System.Collections.Generic;
    2. public class UIBackManage : MonoSingleton<UIBackManage>
    3. {
    4. public delegate void OnBackDelegate();
    5. Stack _OnBackStack = new Stack();
    6. ///
    7. /// 注册 (向 Stack 的顶部添加一个对象)
    8. ///
    9. ///
    10. public void PushOnBack(OnBackDelegate cb)
    11. {
    12. _OnBackStack.Push(cb);
    13. }
    14. ///
    15. /// 移除并返回在 Stack 的顶部的对象
    16. ///
    17. public void PopOnBack()
    18. {
    19. if (_OnBackStack.Count > 0)
    20. {
    21. _OnBackStack.Pop();
    22. }
    23. }
    24. public void ClearOnBackStack()
    25. {
    26. _OnBackStack.Clear();
    27. }
    28. ///
    29. /// 使用返回 (移除并返回在 Stack 的顶部的对象)
    30. ///
    31. public void OnBack()
    32. {
    33. if (_OnBackStack.Count > 0)
    34. {
    35. OnBackDelegate BD = _OnBackStack.Pop();
    36. if (BD != null)
    37. {
    38. BD();
    39. }
    40. }
    41. }
    42. }

    3.下面是 三个UI  相互 返回  调用

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.UI;
    5. ///
    6. /// UI 1
    7. ///
    8. public class Test02 : MonoSingleton<Test02>
    9. {
    10. public Button Fanhui;
    11. public Button XiayiGe;
    12. public GameObject MaskGo;
    13. void Start()
    14. {
    15. Fanhui.onClick.AddListener(OnFanhui);
    16. XiayiGe.onClick.AddListener(OnXiayiGe);
    17. }
    18. void OnEnable()
    19. {
    20. }
    21. public void SetSteat(bool bo)
    22. {
    23. MaskGo.SetActive(bo);
    24. }
    25. public void OnFanhui()
    26. {
    27. UIBackManage.Instance.OnBack();
    28. MaskGo.SetActive(false);
    29. }
    30. public void OnXiayiGe()
    31. {
    32. UIBackManage.Instance.PushOnBack(() => { SetSteat(true); });
    33. Test01.Instance.SetSteat(true);
    34. MaskGo.SetActive(false);
    35. }
    36. }
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.UI;
    5. ///
    6. /// UI 1
    7. ///
    8. public class Test02 : MonoSingleton<Test02>
    9. {
    10. public Button Fanhui;
    11. public Button XiayiGe;
    12. public GameObject MaskGo;
    13. void Start()
    14. {
    15. Fanhui.onClick.AddListener(OnFanhui);
    16. XiayiGe.onClick.AddListener(OnXiayiGe);
    17. }
    18. void OnEnable()
    19. {
    20. }
    21. public void SetSteat(bool bo)
    22. {
    23. MaskGo.SetActive(bo);
    24. }
    25. public void OnFanhui()
    26. {
    27. UIBackManage.Instance.OnBack();
    28. MaskGo.SetActive(false);
    29. }
    30. public void OnXiayiGe()
    31. {
    32. UIBackManage.Instance.PushOnBack(() => { SetSteat(true); });
    33. Test03.Instance.SetSteat(true);
    34. MaskGo.SetActive(false);
    35. }
    36. }
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.UI;
    5. ///
    6. /// UI 3
    7. ///
    8. public class Test03 : MonoSingleton<Test03>
    9. {
    10. public Button Fanhui;
    11. public Button XiayiGe;
    12. public GameObject MaskGo;
    13. void Start()
    14. {
    15. Fanhui.onClick.AddListener(OnFanhui);
    16. XiayiGe.onClick.AddListener(OnXiayiGe);
    17. }
    18. void OnEnable()
    19. {
    20. }
    21. public void SetSteat(bool bo)
    22. {
    23. MaskGo.SetActive(bo);
    24. }
    25. public void OnFanhui()
    26. {
    27. UIBackManage.Instance.OnBack();
    28. MaskGo.SetActive(false);
    29. }
    30. public void OnXiayiGe()
    31. {
    32. UIBackManage.Instance.PushOnBack(() => { SetSteat(true); });
    33. Test01.Instance.SetSteat(true);
    34. MaskGo.SetActive(false);
    35. }
    36. }

    二:以上 方式  适用于  一个UI接下一个UI 的返回 方式

    如果返回按钮 在最顶上呢,只有一个返回按钮时  则不适用,

    方法:

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.UI;
    5. ///
    6. /// ui1
    7. ///
    8. public class Test01 : MonoSingleton<Test01>
    9. {
    10. //public Button Fanhui;
    11. public Button XiayiGe;
    12. public GameObject MaskGo;
    13. void Start()
    14. {
    15. XiayiGe.onClick.AddListener(OnXiayiGe);
    16. }
    17. void OnEnable()
    18. {
    19. }
    20. public void SetSteat(bool bo)
    21. {
    22. MaskGo.SetActive(bo);
    23. }
    24. ///
    25. /// 打开 下一个UI(打开下一个UI时,就把关闭下一个UI和返回当前UI 的操作都注册了)
    26. ///
    27. public void OnXiayiGe()
    28. {
    29. UIBackManage.Instance.PushOnBack(() => {
    30. Test02.Instance.SetSteat(false);//注册
    31. SetSteat(true);//注册
    32. });
    33. Test02.Instance.SetSteat(true);//打开 下一个UI
    34. MaskGo.SetActive(false);//关闭当前UI
    35. }
    36. }

    返回按钮代码:

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.UI;
    5. ///
    6. /// 返回按钮
    7. ///
    8. public class FanHui : MonoSingleton<FanHui>
    9. {
    10. public Button Fanhui_;
    11. void Start()
    12. {
    13. Fanhui_.onClick.AddListener(OnFanhui);
    14. }
    15. public void OnFanhui()
    16. {
    17. UIBackManage.Instance.OnBack();
    18. }
    19. }

  • 相关阅读:
    Bit, byte, KB, GB, MG
    法国巴黎索邦大学博士后—实验物理学
    一文讲完Java常用设计模式(23种)
    超级英雄云计算的技术之旅
    程序员必备好物!快收藏!
    wind版本elasticdump执行报错 unexpected token ‘ in json at
    Codeforces Round 895 (Div. 3)
    死磕面试系列,Java到底是值传递还是引用传递?
    MVC设计模式
    【机器学习】特征工程:特征选择、数据降维、PCA
  • 原文地址:https://blog.csdn.net/qq_37524903/article/details/126227621