简单测试待改进
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
public class UIManager
{
/// <summary>
/// 单例
/// </summary>
private static UIManager instance = null ;
/// <summary>
/// 单例用于访问
/// </summary>
public static UIManager Instance
{
get
{
if (instance == null)
instance = new UIManager();
return instance;
}
}
private UIManager()
{
//第一波初始化
GameObject mainCanvas = GameObject.FindWithTag("MainCanvas");
if (mainCanvas == null)
return;
Transform[] transforms = mainCanvas.GetComponentsInChildren<Transform>();
for (int i = 0; i < transforms.Length; i++)
{
if (transforms[i].name.EndsWith("_Panel"))
{
//挂脚本
AddScript(transforms[i].name.Substring(0, transforms[i].name.Length - 2),transforms[i].gameObject);
//添加panel及其有用控件
AddPanel(transforms[i].name, transforms[i].gameObject);
}
}
}
/// <summary>
/// 存储UI 控件
/// </summary>
private Dictionary<string, Dictionary<string, GameObject>> widgets = new Dictionary<string, Dictionary<string, GameObject>>();
/// <summary>
/// 存储UI panel
/// </summary>
private Dictionary<string, GameObject> panels = new Dictionary<string, GameObject>();
/// <summary>
/// 添加Panel
/// </summary>
/// <param name="panelName"></param>
/// <param name="gameObj"></param>
public void AddPanel(string panelName,GameObject gameObj)
{
if (panels.ContainsKey(panelName))
{
panels[panelName] = gameObj;
Transform[] transforms = gameObj.GetComponentsInChildren<Transform>();
for (int i = 0; i < transforms.Length; i++)
{
//添加控件
if (transforms[i].name.EndsWith("_Widget"))
{
AddWidget(gameObj.name, transforms[i].name, transforms[i].gameObject);
}
//子panel添加panel
if (transforms[i].name.EndsWith("_Panel"))
{
AddPanel(transforms[i].name, transforms[i].gameObject);
}
}
}
}
/// <summary>
/// 添加控件
/// </summary>
/// <param name="panelName"></param>
/// <param name="widgetName"></param>
/// <param name="gameObj"></param>
public void AddWidget(string panelName,string widgetName,GameObject gameObj)
{
if (!widgets.ContainsKey(panelName))
widgets[panelName] = new Dictionary<string, GameObject>();
if (!widgets[panelName].ContainsKey(widgetName))
widgets[panelName][widgetName] = gameObj;
}
/// <summary>
/// 获取控件
/// </summary>
/// <param name="panelName"></param>
/// <param name="widgetName"></param>
/// <returns></returns>
public GameObject GetWidget(string panelName,string widgetName)
{
if (!widgets.ContainsKey(panelName))
return null;
if (!widgets[panelName].ContainsKey(widgetName))
return null;
return widgets[panelName][widgetName];
}
/// <summary>
/// 获取panel
/// </summary>
/// <param name="panelName"></param>
/// <returns></returns>
public GameObject GetPanel(string panelName)
{
if (panels.ContainsKey(panelName))
return panels[panelName];
return null;
}
/// <summary>
/// 移除panel
/// </summary>
/// <param name="panelName"></param>
public void RemovePanel(string panelName)
{
if (panels.ContainsKey(panelName))
panels.Remove(panelName);
if (widgets.ContainsKey(panelName))
widgets.Remove(panelName);
}
/// <summary>
/// 移除控件
/// </summary>
/// <param name="panelName"></param>
/// <param name="widgetName"></param>
public void RemoveWidget(string panelName,string widgetName)
{
if (!widgets.ContainsKey(panelName))
return;
if (widgets[panelName].ContainsKey(widgetName))
widgets[panelName].Remove(widgetName);
}
/// <summary>
/// 清空所有控件panel
/// </summary>
public void ClearWidget()
{
panels.Clear();
widgets.Clear();
}
/// <summary>
/// 挂载脚本
/// </summary>
/// <param name="name"></param>
/// <param name="gameObj"></param>
public void AddScript(string name,GameObject gameObj)
{
System.Type type = System.Type.GetType(name);
gameObj.AddComponent(type);
}
/// <summary>
/// 获取对象指定类型组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="panelName"></param>
/// <param name="widgetName"></param>
/// <returns></returns>
public T GetNeedType<T>(string panelName, string widgetName)
{
return GetWidget(panelName, widgetName).GetComponent<T>();
}
/// <summary>
/// UI 添加事件方法
/// </summary>
/// <param name="widgetName"></param>
/// <param name="eventTriggerType"></param>
/// <param name="action"></param>
public void AddEvent(string panelName, string widgetName, EventTriggerType eventTriggerType, UnityAction<BaseEventData> action)
{
AddEvent(GetWidget(panelName, widgetName), eventTriggerType, action);
}
/// <summary>
/// UI 添加事件方法
/// </summary>
/// <param name="gameObject"></param>
/// <param name="eventTriggerType"></param>
/// <param name="action"></param>
public void AddEvent(GameObject gameObject, EventTriggerType eventTriggerType, UnityAction<BaseEventData> action)
{
//获取EventTrigger
EventTrigger trigger = gameObject.GetComponent<EventTrigger>();
//没有则添加
if (trigger == null)
{
trigger = gameObject.AddComponent<EventTrigger>();
// 实例化triggers
trigger.triggers = new List<EventTrigger.Entry>();
}
// 定义需要绑定的事件类型。并设置回调函数
EventTrigger.Entry entry = new EventTrigger.Entry();
// 设置 事件类型
entry.eventID = eventTriggerType;
// 设置回调函数
entry.callback = new EventTrigger.TriggerEvent();
UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(action);
entry.callback.AddListener(callback);
// 添加事件触发记录到GameObject的事件触发组件
trigger.triggers.Add(entry);
}
}