Unity界面组件【UGUI】封装
1、使用场景:
UI界面显示、UI组件封装
2、实现思路:
抽象出一个UI界面基类,里面自带保存全部UI组件的方法,然后还需要一个外部可调用获取指定组件的方法,子类继承即可使用
3、实现原理:
用一个字典保存全部UI组件,使用时直接根据载体对象名称获取就行
3、具体实现:
C#
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组件】
C#
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");
}
}
效果:
评论