• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共151篇

    Unity - 游戏引擎

关闭

返回栏目

关闭

返回Unity - 游戏引擎栏目

141 - UIManager.cs - UI界面

作者:

贺及楼

成为作者

更新日期:2023-09-17 11:01:23

BasePanel.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6. /// <summary>
  7. /// 通过代码,快速找到所有子控件
  8. /// </summary>
  9. public class BasePanel : MonoBehaviour
  10. {
  11. private Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();//里氏转换,所有控件
  12. // Start is called before the first frame update
  13. void Awake()
  14. {
  15. FindChildrenControl<Button>();
  16. FindChildrenControl<Image>();
  17. FindChildrenControl<Toggle>();
  18. FindChildrenControl<Text>();
  19. FindChildrenControl<Scrollbar>();
  20. FindChildrenControl<ScrollRect>();
  21. FindChildrenControl<Slider>();
  22. }
  23. /// <summary>
  24. /// 显示
  25. /// </summary>
  26. public virtual void ShowMe()
  27. {
  28. }
  29. /// <summary>
  30. /// 隐藏
  31. /// </summary>
  32. public virtual void HideMe()
  33. {
  34. }
  35. /// <summary>
  36. /// 得到对应名字的控件
  37. /// </summary>
  38. /// <typeparam name="T"></typeparam>
  39. /// <param name="controlName"></param>
  40. /// <returns></returns>
  41. protected T GetControl<T>(string controlName)where T: UIBehaviour
  42. {
  43. if (controlDic.ContainsKey(controlName))
  44. {
  45. //for循环字典
  46. for(int i = 0; i < controlDic[controlName].Count; ++i)
  47. {
  48. if(controlDic[controlName][i] is T)
  49. {
  50. return controlDic[controlName][i] as T;
  51. }
  52. }
  53. }
  54. return null;
  55. }
  56. /// <summary>
  57. /// 找Panel的控件们
  58. /// </summary>
  59. /// <typeparam name="T"></typeparam>
  60. private void FindChildrenControl<T>() where T: UIBehaviour
  61. {
  62. T[] controls = this.GetComponentsInChildren<T>();//Panel所有的Button组件
  63. //循环找所有控件,保存到字典里
  64. for (int i = 0; i < controls.Length; ++i)
  65. {
  66. string objName = controls[i].gameObject.name;//这是控件名字
  67. //字典有就加,没有就新建
  68. if (controlDic.ContainsKey(objName))
  69. controlDic[objName].Add(controls[i]);
  70. else
  71. controlDic.Add(objName, new List<UIBehaviour>() { controls[i] });
  72. }
  73. }
  74. }

UIManager.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Events;
  5. //枚举,UI层级
  6. public enum E_UI_Layer
  7. {
  8. Bot,
  9. Mid,
  10. Top,
  11. System,
  12. }
  13. public class UIManager : BaseManager<UIManager>
  14. {
  15. public Dictionary<string, BasePanel> panelDict = new Dictionary<string, BasePanel>();
  16. //层级
  17. private Transform bot;//获得bot
  18. private Transform mid;//获得mid
  19. private Transform top;//获得top
  20. private Transform system;//获得system
  21. /// <summary>
  22. /// 构造函数:创建Canvas和EventSystem
  23. /// </summary>
  24. public UIManager()
  25. {
  26. GameObject obj = ResourcesManager.GetInstance().Load<GameObject>("UI/Canvas");
  27. Transform canvas = obj.transform;
  28. Object.DontDestroyOnLoad(obj);//过场景不移除
  29. //找到各层
  30. bot = canvas.Find("Bot");
  31. mid = canvas.Find("Mid");
  32. top = canvas.Find("Top");
  33. system = canvas.Find("System");
  34. GameObject es = ResourcesManager.GetInstance().Load<GameObject>("UI/EventSystem");
  35. Object.DontDestroyOnLoad(es);//过场景不移除
  36. }
  37. /// <summary>
  38. /// 显示面板
  39. /// </summary>
  40. /// <typeparam name="T">面板脚本类型</typeparam>
  41. /// <param name="panelName">面板名</param>
  42. /// <param name="layer">层级(可不填)</param>
  43. /// <param name="callBack">创建面板预设成功后做的事(可不填)</param>
  44. public void ShowPanel<T>(string panelName,E_UI_Layer layer = E_UI_Layer.Mid,UnityAction<T> callBack = null)where T:BasePanel
  45. {
  46. if (panelDict.ContainsKey(panelName))
  47. {
  48. panelDict[panelName].ShowMe();
  49. if (callBack != null)
  50. callBack(panelDict[panelName] as T); return;
  51. }
  52. ResourcesManager.GetInstance().LoadAsync<GameObject>("UI/" + panelName, (obj) =>
  53. {
  54. //把它作为canvas的子对象,位置
  55. //确定显示层级
  56. Transform father = bot;
  57. switch (layer)
  58. {
  59. case E_UI_Layer.Mid:
  60. father = mid;
  61. break;
  62. case E_UI_Layer.Top:
  63. father = top;
  64. break;
  65. case E_UI_Layer.System:
  66. father = system;
  67. break;
  68. }
  69. //设置父对象 相对位置 大小
  70. obj.transform.SetParent(father);
  71. obj.transform.localPosition = Vector3.zero;
  72. obj.transform.localScale = Vector3.one;
  73. (obj.transform as RectTransform).offsetMax = Vector3.zero;
  74. (obj.transform as RectTransform).offsetMin = Vector3.zero;
  75. //得到预设体身上的脚本
  76. T panel = obj.GetComponent<T>();
  77. if (callBack != null)
  78. callBack(panel);
  79. //保存在字典里
  80. panelDict.Add(panelName, panel);
  81. });
  82. }
  83. /// <summary>
  84. /// 隐藏
  85. /// </summary>
  86. public void HidePanel(string panelName)
  87. {
  88. if (panelDict.ContainsKey(panelName))
  89. {
  90. panelDict[panelName].HideMe();
  91. GameObject.Destroy(panelDict[panelName].gameObject);
  92. panelDict.Remove(panelName);
  93. }
  94. }
  95. }