Unity界面组件【UGUI】封装
1、使用场景:
UI界面显示、UI组件封装
2、实现思路:
抽象出一个UI界面基类,里面自带保存全部UI组件的方法,然后还需要一个外部可调用获取指定组件的方法,子类继承即可使用
3、实现原理:
用一个字典保存全部UI组件,使用时直接根据载体对象名称获取就行
3、具体实现:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; /// <summary> /// UI 面板基类 /// </summary> public class UIBasePanel : MonoBehaviour { public Dictionary<string, List<UIBehaviour>> UIComponentsDict = new Dictionary<string, List<UIBehaviour>>(); void Awake() { AddComponentsToDict<Button>(); AddComponentsToDict<Text>(); AddComponentsToDict<Image>(); AddComponentsToDict<Toggle>(); AddComponentsToDict<Slider>(); AddComponentsToDict<ScrollRect>(); } /// <summary> /// 根据 指定类型 获取全部组件,保存在字典中 /// </summary> /// <typeparam name="T">UI组件类型</typeparam> private void AddComponentsToDict<T>() where T : UIBehaviour { //获取该对象 全部子类中 的该组件类型对象 T[] components = this.transform.GetComponentsInChildren<T>(); string key = ""; for (int i = 0; i < components.Length; i++) { key = components[i].gameObject.name; //字典中含有 该键值【该子类对象中 包含多个控件】,加入到list中保存 if (UIComponentsDict.ContainsKey(key)) { UIComponentsDict[key].Add(components[i]); } else { //字典中 首次添加 该组件对象 UIComponentsDict.Add(key,new List<UIBehaviour>() { components[i] }); } } } /// <summary> /// 根据 对象名称 获取 需要的组件 /// </summary> /// <typeparam name="T">指定类型的UI组件</typeparam> /// <param name="name">对象名称</param> /// <returns></returns> public T GetUIComponent<T>(string name) where T:UIBehaviour { //判断字典中是否包含 该对象的组件 if (UIComponentsDict.ContainsKey(name)) { //遍历所有组件 找到 目标类型组件 for (int i = 0; i < UIComponentsDict[name].Count; i++) { if (UIComponentsDict[name][i] is T) { return UIComponentsDict[name][i] as T; } } } return null; } }
测试:【仅测试Button组件】
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class UITest : UIBasePanel { void Start () { GetUIComponent<Button>("btnStart").onClick.AddListener(GameStart); GetUIComponent<Button>("btnEnd").onClick.AddListener(GameExit); } void Update () { } private void GameStart() { Debug.Log("GameStart"); } private void GameExit() { Debug.Log("GameExit"); } }
效果:
评论