
UI管理者类:包含全部子控件信息,给外加提供接口,以访问全部子控件
UIBase类:通过UI管理者给子控件添加事件监听
UIBehavior:给自身添加事件监听
源码:
UIManger:
using System.Collections.Generic;
using UnityEngine;
public class UIManager : MonoBehaviour {
private GameObject mainCanvas;
public GameObject MainCanvas
{
get
{
if (mainCanvas == null)
mainCanvas = GameObject.FindGameObjectWithTag("MainCanvas");
return mainCanvas;
}
}
/// <summary>
/// 获取panel 身上的UIBase
/// </summary>
/// <param name="panelName"></param>
/// <returns></returns>
public UIBase GetPanelCtrl(string panelName)
{
GameObject tmpObj= GetGameObject(panelName, panelName);
return tmpObj.GetComponent<UIBase>();
}
/// <summary>
/// string 哪个panel Dictionary<string, GameObject> panel上的每个子控件
/// </summary>
Dictionary<string, Dictionary<string, GameObject>> allChilds;
public static UIManager Instance;
private void Awake()
{
Instance = this;
allChilds = new Dictionary<string, Dictionary<string, GameObject>>();
}
/// <summary>
/// 将panel下面的子控件 object 存入账本
/// </summary>
/// <param name="panelName"></param>
/// <param name="wedgetName"> 同一个panel 下面子控件的名字不能一样</param>
/// <param name="obj"></param>
public void RegistGameObject(string panelName,string wedgetName,GameObject obj)
{
if (!allChilds.ContainsKey(panelName))
{
// allChilds[panelName] = new Dictionary<string, GameObject>();
allChilds.Add(panelName,new Dictionary<string, GameObject>());
}
if (!allChilds[panelName].ContainsKey(wedgetName))
{
allChilds[panelName].Add(wedgetName, obj);
}
}
/// <summary>
// 提供接口 供外界 获取 wedget Object
/// </summary>
/// <param name="panelName"></param>
/// <param name="wedgetName"></param>
/// <returns></returns>
public GameObject GetGameObject(string panelName ,string wedgetName)
{
// 是否包含panel
if (allChilds.ContainsKey(panelName))
{
return allChilds[panelName][wedgetName];
}
return null;
}
/// <summary>
/// 将整个panel 从账本 中 删除
/// 销毁整个panel
/// </summary>
/// <param name="panelName"></param>
public void UnRegistPanel(string panelName )
{
if (allChilds.ContainsKey(panelName))
{
allChilds[panelName].Clear();
allChilds[panelName] = null;
}
}
}
UIBase:
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class UIBase : MonoBehaviour {
private void Awake()
{
// 获取panel下面 所有的子控件
Transform[] allChild= transform.GetComponentsInChildren<Transform>();
for (int i = 0; i < allChild.Length; i++)
{
if (allChild[i].name.EndsWith("_N"))
{
allChild[i].gameObject.AddComponent<UIBehaour>();
}
}
}
public void ShowOrHide(bool isShow)
{
transform.GetChild(0).gameObject.SetActive(isShow);
// gameObject.SetActive(isShow);
}
public GameObject GetGameObject(string widgetName)
{
// 从UIManager 获取想要的物体
GameObject tmpObj = UIManager.Instance.GetGameObject(transform.name, widgetName);
return tmpObj;
}
public UIBehaour GetBehaour(string widgetName )
{
GameObject tmpObj = UIManager.Instance.GetGameObject(transform.name, widgetName);
if (tmpObj != null)
{
UIBehaour tmpBehaour = tmpObj.GetComponent<UIBehaour>();
return tmpBehaour;
}
return null;
}
/// <summary>
/// 对外提供接口 对button 事件绑定
/// </summary>
public void AddButtonListen(string widgetName ,UnityAction func)
{
UIBehaour tmpBehaour= GetBehaour(widgetName);
if (tmpBehaour != null)
{
tmpBehaour.AddButtonListen(func);
}
}
/// <summary>
/// 提供外界一个 注册 slider 事件接口
/// </summary>
/// <param name="widgetName"></param>
/// <param name="func"></param>
public void AddSliderListen(string widgetName ,UnityAction<float> func )
{
UIBehaour tmpBehaour = GetBehaour(widgetName);
if (tmpBehaour != null)
{
tmpBehaour.AddSliderListen(func);
}
}
public void AddInputEndEditor(string widgetName, UnityAction<string> func)
{
UIBehaour tmpBehaour = GetBehaour(widgetName);
if (tmpBehaour != null)
{
tmpBehaour.AddInputFiledEndEditor(func);
}
}
public void AddDragEvent(string widgetName, UnityAction<BaseEventData> func)
{
UIBehaour tmpBehaour = GetBehaour(widgetName);
if (tmpBehaour != null)
{
tmpBehaour.AddDragLisenter(func);
}
}
}
UIBhavior
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class UIBehaour : MonoBehaviour {
private void Awake()
{
// 找到自己所在的panel的名字
UIBase tmpBase= transform.GetComponentInParent<UIBase>();
//在管理者注册自身信息*
UIManager.Instance.RegistGameObject(tmpBase.name, transform.name,gameObject);
}
/// <summary>
/// 获取button 事件
/// </summary>
/// <param name="func"></param>
public void AddButtonListen(UnityAction func)
{
Button tmpBtn = transform.GetComponent<Button>();
if (tmpBtn != null)
{
tmpBtn.onClick.AddListener(func);
}
}
public void AddSliderListen(UnityAction<float> func)
{
Slider tmpBtn = transform.GetComponent<Slider>();
if (tmpBtn != null)
{
tmpBtn.onValueChanged.AddListener(func);
}
}
public void AddInputFiledEndEditor(UnityAction<string> func)
{
InputField tmpBtn = transform.GetComponent<InputField>();
if (tmpBtn != null)
{
// 结束 编辑
tmpBtn.onEndEdit.AddListener(func);
// 每次值改变
//tmpBtn.onValueChanged.AddListener();
}
}
public void AddInputFiledValueChange(UnityAction<string> func)
{
InputField tmpBtn = transform.GetComponent<InputField>();
if (tmpBtn != null)
{
// 结束 编辑
// tmpBtn.onEndEdit.AddListener(func);
// 每次值改变
tmpBtn.onValueChanged.AddListener(func);
}
}
/// <summary>
/// 动态 添加 接口时间 回调
/// </summary>
/// <param name="action"></param>
public void AddButtonDownLisenter(UnityAction<BaseEventData> action)
{
EventTrigger trigger = gameObject.GetComponent<EventTrigger>();
if (trigger == null)
trigger = gameObject.AddComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
//绑定哪个接口
entry.eventID = EventTriggerType.PointerClick;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener(action);
trigger.triggers.Add(entry);
}
public void AddDragLisenter(UnityAction<BaseEventData> action)
{
EventTrigger trigger = gameObject.GetComponent<EventTrigger>();
if (trigger == null)
trigger = gameObject.AddComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
//绑定哪个接口
entry.eventID = EventTriggerType.Drag;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener(action);
trigger.triggers.Add(entry);
}
}
收工~ 一个常见的Unity UI框架