当前位置:   article > 正文

UnityUI_unityuiextensions

unityuiextensions

目前使用的框架:

1.ui类

(1)每一个ui都放在一个panel里面,panel当中要加入CanvesGroup组件以便控制其子物件与ui的交互

(2)BasePanel为所有自定义Panel的父类,每一个自定义的Panel要继承BasePanel并实现抽象方法

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class BasePanel
  5. {
  6. /// <summary>
  7. /// 储存uiPanel的名字和加载路径信息
  8. /// </summary>
  9. public UIType uIType;
  10. /// <summary>
  11. /// 当前ui在场景中绑定的物体
  12. /// </summary>
  13. public GameObject activeObj;
  14. public BasePanel(UIType _uIType)
  15. {
  16. uIType = _uIType;
  17. }
  18. public virtual void onStart()
  19. {
  20. UIMethod.AddOrGetComponent<CanvasGroup>(activeObj).interactable = true;
  21. }
  22. public virtual void onEnable()
  23. {
  24. UIMethod.AddOrGetComponent<CanvasGroup>(activeObj).interactable = true;
  25. }
  26. public virtual void onDisable()
  27. {
  28. UIMethod.AddOrGetComponent<CanvasGroup>(activeObj).interactable = false;
  29. }
  30. public virtual void onDestory()
  31. {
  32. UIMethod.AddOrGetComponent<CanvasGroup>(activeObj).interactable = false;
  33. }
  34. }
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class UIType
  5. {
  6. private string _name;
  7. private string _path;
  8. public UIType(string uIType,string objPath)
  9. {
  10. _name = uIType;
  11. _path = objPath;
  12. }
  13. public string Name { get => _name; }
  14. public string Path { get => _path; }
  15. }

 实现示例:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class StartPanel : BasePanel
  6. {
  7. private static string _name = "StartPanel";
  8. private static string _path = @"Panel\StartPanel";
  9. public static UIType uiType = new UIType(_name, _path);
  10. public StartPanel() : base(uiType)
  11. {
  12. }
  13. public override void onStart()
  14. {
  15. base.onStart();
  16. UIMethod.AddOrGetComponentInChildren<Button>(activeObj, "CloseDD").onClick.AddListener(closeDD);
  17. UIMethod.AddOrGetComponentInChildren<Button>(activeObj, "Load").onClick.AddListener(changeScene);
  18. UIMethod.AddOrGetComponentInChildren<Button>(activeObj, "Load0").onClick.AddListener(changeScene0);
  19. }
  20. private void closeDD()
  21. {
  22. GameObject.DestroyImmediate(UIMethod.findObjInChildren(activeObj, "Dropdown"));
  23. //UIMethod.findObjInChildren(activeObj, "Dropdown").SetActive(false);
  24. }
  25. private void changeScene()
  26. {
  27. Scene1 scene1 = new Scene1();
  28. SceneControl.getInstance().Load(Scene1.nameScene, scene1);
  29. }
  30. private void changeScene0()
  31. {
  32. Scene0 scene0 = new Scene0();
  33. SceneControl.getInstance().Load(Scene0.nameScene, scene0);
  34. }
  35. public override void onEnable()
  36. {
  37. base.onEnable();
  38. }
  39. public override void onDisable()
  40. {
  41. base.onDisable();
  42. }
  43. public override void onDestory()
  44. {
  45. base.onDestory();
  46. }
  47. }

2.UI工具类

(1)从当前物体的子物体获得组件

public static T AddOrGetComponentInChildren<T>(GameObject panel,string nameChildren) where T:Component

(2)从当前物体获取组件

public static T AddOrGetComponent<T> (GameObject panel) where T:Component

(3)寻找在这个物体下面的子物体

public static GameObject findObjInChildren(GameObject panel,string nameChildren)

(4)获取当前场景下的画布

public static GameObject getCanves()

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public static class UIMethod
  5. {
  6. /// <summary>
  7. /// 获取当前场景下的画布
  8. /// </summary>
  9. /// <returns></returns>
  10. public static GameObject getCanves()
  11. {
  12. GameObject canves = GameObject.FindObjectOfType<Canvas>().gameObject;
  13. if(canves==null)
  14. {
  15. Debug.LogError("Cannot find Canves");
  16. }
  17. return canves;
  18. }
  19. /// <summary>
  20. /// 寻找在这个物体下面的子物体
  21. /// </summary>
  22. /// <param name="panel"></param>
  23. /// <param name="nameChildren">子物体的名字</param>
  24. /// <returns></returns>
  25. public static GameObject findObjInChildren(GameObject panel,string nameChildren)
  26. {
  27. Transform[] ts = panel.GetComponentsInChildren<Transform>();
  28. foreach (var item in ts)
  29. {
  30. if(item.gameObject.name==nameChildren)
  31. {
  32. return item.gameObject;
  33. }
  34. }
  35. Debug.LogError($"NotFindChildren:{nameChildren}");
  36. return null;
  37. }
  38. /// <summary>
  39. /// 从当前物体获取组件
  40. /// </summary>
  41. /// <typeparam name="T">组件名字</typeparam>
  42. /// <param name="panel">父物体</param>
  43. /// <returns></returns>
  44. public static T AddOrGetComponent<T> (GameObject panel) where T:Component
  45. {
  46. T target = panel.GetComponent<T>();
  47. if(target==null)
  48. {
  49. Debug.LogError($"NotFindConponent:{panel.name}");
  50. target=panel.AddComponent<T>();
  51. }
  52. return target;
  53. }
  54. /// <summary>
  55. /// 从当前物体的子物体获得组件
  56. /// </summary>
  57. /// <typeparam name="T">组件类型</typeparam>
  58. /// <param name="panel">父物体</param>
  59. /// <param name="nameChildren"></param>
  60. /// <returns></returns>
  61. public static T AddOrGetComponentInChildren<T>(GameObject panel,string nameChildren) where T:Component
  62. {
  63. GameObject obj = findObjInChildren(panel,nameChildren);
  64. T target = obj.GetComponent<T>();
  65. if (target == null)
  66. {
  67. Debug.LogError($"NotFindConponent:{obj.name}");
  68. target = obj.AddComponent<T>();
  69. }
  70. return target;
  71. }
  72. }

 3.UIManager

使用其中的push和pop方法来加入ui和弹出当前ui

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5. public class UIManager
  6. {
  7. private Dictionary<string, GameObject> dic_ui;
  8. private Stack<BasePanel> sta_ui;
  9. /// <summary>
  10. /// 场景下的画布
  11. /// </summary>
  12. public GameObject canvesObj;
  13. private static UIManager instance;
  14. public static UIManager getInstance()
  15. {
  16. if(instance==null)
  17. {
  18. Debug.LogError("NotFoundInstance");
  19. return null;
  20. }
  21. return instance;
  22. }
  23. public UIManager()
  24. {
  25. dic_ui = new Dictionary<string, GameObject>();
  26. sta_ui = new Stack<BasePanel>();
  27. instance = this;
  28. }
  29. public GameObject getSingleObj(UIType uIType)
  30. {
  31. if(dic_ui.ContainsKey(uIType.Name))
  32. {
  33. return dic_ui[uIType.Name];
  34. }
  35. if(canvesObj==null)
  36. {
  37. canvesObj = UIMethod.getCanves();
  38. }
  39. GameObject uiObj = GameObject.Instantiate<GameObject>(Resources.Load<GameObject>(uIType.Path), canvesObj.transform);
  40. dic_ui.Add(uIType.Name, uiObj);
  41. return uiObj;
  42. }
  43. public void push(BasePanel uiPanel)
  44. {
  45. if(sta_ui.Count==0)
  46. {
  47. GameObject uiObj = getSingleObj(uiPanel.uIType);
  48. uiPanel.activeObj = uiObj;
  49. uiObj.name = uiPanel.uIType.Name;
  50. sta_ui.Push(uiPanel);
  51. }
  52. else
  53. {
  54. if(sta_ui.Peek().uIType.Name!=uiPanel.uIType.Name)
  55. {
  56. sta_ui.Peek().onDisable();
  57. GameObject uiObj = getSingleObj(uiPanel.uIType);
  58. uiPanel.activeObj = uiObj;
  59. uiObj.name = uiPanel.uIType.Name;
  60. sta_ui.Push(uiPanel);
  61. }
  62. }
  63. uiPanel.onStart();
  64. }
  65. public void pop(bool isLoad)
  66. {
  67. if(isLoad)
  68. {
  69. if(sta_ui.Count>0)
  70. {
  71. dic_ui.Remove(sta_ui.Peek().uIType.Name);
  72. sta_ui.Peek().onDisable();
  73. sta_ui.Peek().onDestory();
  74. GameObject.DestroyImmediate(sta_ui.Peek().activeObj);
  75. sta_ui.Pop();
  76. pop(true);
  77. }
  78. }
  79. else
  80. {
  81. if (sta_ui.Count > 0)
  82. {
  83. dic_ui.Remove(sta_ui.Peek().uIType.Name);
  84. sta_ui.Peek().onDisable();
  85. sta_ui.Peek().onDestory();
  86. GameObject.DestroyImmediate(sta_ui.Peek().activeObj);
  87. sta_ui.Pop();
  88. if(sta_ui.Count>0)
  89. {
  90. sta_ui.Peek().onEnable();
  91. }
  92. }
  93. }
  94. }
  95. }

4.场景加载基类

所有自定义场景类都要继承这个基类,并且定义场景名字

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public abstract class SceneBase
  5. {
  6. public abstract void enterScene();
  7. public abstract void exitScene();
  8. }

场景类示例:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5. public class Scene0 : SceneBase
  6. {
  7. public static string nameScene = "Scene0";
  8. public override void enterScene()
  9. {
  10. UIManager.getInstance().push(new StartPanel());
  11. //Debug.Log($"Load{SceneManager.GetActiveScene().name}");
  12. }
  13. public override void exitScene()
  14. {
  15. //UIManager.getInstance().pop(true);
  16. }
  17. }

5.场景控制类

切换场景在事件或者GM当中调用方法场景控制类当中的load即可

注意:每一次创建新场景,在创建场景类之后,记得在这里进行注册

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5. public class SceneControl
  6. {
  7. private Dictionary<string, SceneBase> dic_scene = new Dictionary<string, SceneBase>
  8. {
  9. [Scene0.nameScene] = new Scene0(),
  10. [Scene1.nameScene]=new Scene1(),
  11. [SceneLaucher.nameScene]=new SceneLaucher()
  12. };
  13. private static SceneControl instance;
  14. public static SceneControl getInstance()
  15. {
  16. if(instance==null)
  17. {
  18. Debug.Log("NotFindSceneInstance");
  19. }
  20. return instance;
  21. }
  22. public SceneControl()
  23. {
  24. instance = this;
  25. }
  26. public void Load(string nameScene,SceneBase sceneBase)
  27. {
  28. if(!dic_scene.ContainsKey(nameScene))
  29. {
  30. dic_scene.Add(nameScene, sceneBase);
  31. }
  32. dic_scene[SceneManager.GetActiveScene().name].exitScene();
  33. #region popAllUI
  34. UIManager.getInstance().pop(true);
  35. #endregion
  36. SceneManager.LoadScene(nameScene);
  37. sceneBase.enterScene();
  38. }
  39. }

6.GameManeger

用以初始化SceneControl和UIManager

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class GameManager : MonoBehaviour
  5. {
  6. public static GameManager _instance;
  7. public static GameManager getInstance()
  8. {
  9. if(_instance==null)
  10. {
  11. Debug.LogError("NotHaveInstance");
  12. }
  13. return _instance;
  14. }
  15. private UIManager _uIManager;
  16. public UIManager uIManager { get => _uIManager; }
  17. private SceneControl _sceneControl;
  18. public SceneControl sceneControl { get => _sceneControl; }
  19. private void Awake()
  20. {
  21. if(_instance==null)
  22. {
  23. _instance = this;
  24. }
  25. else
  26. {
  27. GameManager.Destroy(this.gameObject);
  28. }
  29. _uIManager = new UIManager();
  30. _sceneControl = new SceneControl();
  31. }
  32. private void Start()
  33. {
  34. DontDestroyOnLoad(this);
  35. uIManager.push(new StartPanel());
  36. //SceneControl.getInstance().Load(Scene0.nameScene, new Scene0());
  37. }
  38. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/881860
推荐阅读
相关标签
  

闽ICP备14008679号