说明
最近研究到一个功能脚本,在获取UGUI组件不用拖拽获取!在场景开始中获取需要获取的控件,将控件名字和UIBehaviour
存储到字典中,在获取时根据里氏替换原则–基类转换为子类转换成对应的UI组件。
脚本如下:
获取UI组件的方法
//获取需要获取的UI组件 T类型:UI组件名字
private void GetUI<T>() where T:UIBehaviour
{
T[] uis = this.GetComponentsInChildren<T>();
for (int i = 0; i < uis.Length; i++)
{
if (uiDic.ContainsKey(uis[i].name))
{
uiDic[uis[i].name].Add(uis[i]);
}
else
{
uiDic.Add(uis[i].name, new List<UIBehaviour>() { uis[i] });
}
}
}
返回UI组件的方法
public T ReturnUI<T>(string name) where T:UIBehaviour
{
if (uiDic.ContainsKey(name))
{
for (int i = 0; i < uiDic[name].Count; i++)
{
if (uiDic[name][i] is T)
{
return uiDic[name][i] as T;
}
}
}
return null;
}
完整脚本:
Awake()方法中 GetUI<Button>();
获取对应的UI组件,这个脚本挂载到Canvas用于获取挂载在其下的UI控件。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class UIMgr : MonoBehaviour
{
public static UIMgr instance;
private Dictionary<string, List<UIBehaviour>> uiDic = new Dictionary<string, List<UIBehaviour>>();
private void Awake()
{
if(instance==null)
instance = this;
GetUI<Button>();
GetUI<Image>();
}
void Start()
{
}
public T ReturnUI<T>(string name) where T:UIBehaviour
{
if (uiDic.ContainsKey(name))
{
for (int i = 0; i < uiDic[name].Count; i++)
{
if (uiDic[name][i] is T)
{
return uiDic[name][i] as T;
}
}
}
return null;
}
//获取需要获取的UI组件 T:UI组件名字
private void GetUI<T>() where T:UIBehaviour
{
T[] uis = this.GetComponentsInChildren<T>();
for (int i = 0; i < uis.Length; i++)
{
if (uiDic.ContainsKey(uis[i].name))
{
uiDic[uis[i].name].Add(uis[i]);
}
else
{
uiDic.Add(uis[i].name, new List<UIBehaviour>() { uis[i] });
}
}
}
}
Test脚本随便挂载到场景中去,根据场景中的UI名字获取。
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
void Start()
{
UIMgr.instance.ReturnUI<Button>("StartBtn").onClick.AddListener(() =>
{
print("当前按钮触发");
});
}
}
如下图: