首页 学习日记正文

Unity界面组件【UGUI】封装

阿沐 学习日记 2020-04-15 1231 0 unity

Unity界面组件【UGUI】封装

image.png

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");
    }
}

效果:

image.png

打赏

评论

Music