- 层级管理
## 三级 ##
UImanager:管理所有UI(panel)
UIScence:管理panel上的所有需要被监听的子物体UI
UIListener:监听所有的UI事件
Canvas:—UImanager
panel_1:--UIScence
button1;--UIListener
button2;--UIListener
. . . . . . . .;
pannel_2:
button1;
button2;
. . . . . . . . .
UImanager获取所有UIScence,UIScence获取所有UIListener。
从下往上,从底层往高层
每一个panel上有许多物体,图片,文本,按钮等,将需要对其进行操作的物体上录入一个标志,这里是为物体挂上了一个脚本UIListener,记录事件。
UIListener
public class UITirggerListener : EventTrigger {
public delegate void OnEventSystem();
public event OnEventSystem onClick;
public event OnEventSystem onBeginDrag;
public event OnEventSystem onDrag;
public event OnEventSystem onEndDrag;
public event OnEventSystem onPointerEnter;
private UITirggerListener trigger;
public override void OnPointerClick(PointerEventData eventData)
{
if (onClick != null) onClick();
}
public override void OnBeginDrag(PointerEventData eventData)
{
if (onBeginDrag != null) onBeginDrag();
}
public override void OnDrag(PointerEventData eventData)
{
if (onDrag != null) onDrag();
}
public override void OnEndDrag(PointerEventData eventData)
{
if (onEndDrag != null) onEndDrag();
}
public override void OnPointerEnter(PointerEventData eventData)
{
if (onPointerEnter != null) onPointerEnter();
}
}
UIScence对这些带有事件监听的子物体进行管理,寻找寻找所有带有UITriggerListener的子物体。事件绑定在子类里面实现,每一个panel都是不同的子类。
UIScence基类
public class UIScene : MonoBehaviour {
/// <summary>
/// 管理所有需要被监听的子物体
/// </summary>
public Dictionary<string, UITirggerListener>
listener = new Dictionary<string, UITirggerListener>();
public void Start () {
Init();
}
/// <summary>
/// 根据名字在字典当中获取子物体
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public UITirggerListener GetTrigger(string name)
{
if (listener.ContainsKey(name))
return listener[name];
return null;
}
public T GetTrigger<T>(string name) where T:Component
{
UITirggerListener item= GetTrigger(name);
if (item != null)
return item.transform.GetComponent<T>();
return null;
}
public void Init()
{
FindChildTrigger(transform);
}
/// <summary>
/// 寻找所有带有UITriggerListener的子物体
/// </summary>
public void FindChildTrigger(Transform t)
{
UITirggerListener trigger = t.GetComponent<UITirggerListener>();
if (trigger != null)
{
string name = t.gameObject.name;
if (!listener.ContainsKey(name))
{
listener.Add(name, trigger);
}
else
{
Debug.LogWarning("Scene[" + this.transform.name + "]UISceneWidget[" + name + "]is exist!");
}
}
for (int i = 0; i < t.childCount; ++i)
{
Transform child = t.GetChild(i);
FindChildTrigger(child);
}
}
}
UImanager找到所有挂载有UIScene脚本的物体
UImanager
public class UISceneName
{
public const string Panel_Login = "Panel_login";
public const string Panel_Create = "Panel_create";
public const string Panel_Main = "Panel_main";
public const string Panel_Bag = "Panel_bag";
public const string Panel_Store="Panel_store";
public const string Panel_Friend="Panel_friend";
public const string Panel_Hero="Panel_hero";
public const string Panel_Talk="Panel_talk";
}//canvas下所有panel名
public class UIManager : MonoSingleton<UIManager> {
//MonoSingleton -泛型单例
Dictionary<string, UIScene> scenes = new Dictionary<string, UIScene>();
public void Init()
{
//找到所有挂载有UIScene脚本的物体
UIScene[] items = GameObject.FindObjectsOfType<UIScene>();
for (int i = 0; i < items.Length; i++)
{
//吧Object转换成GameObject
// GameObject go = (GameObject)items[i] ;
UIScene go = items[i];
if (!scenes.ContainsKey(go.name))
{
//将挂载有UIScene的游戏对象增加到管理的字典当中
scenes.Add(go.name, go);
go.gameObject.SetActive(false);
}
}
}
/// <summary>
/// 开启和关闭Panel
/// </summary>
/// <param name="name">Panel名称</param>
/// <param name="isActive">开启或者关闭</param>
public void IsActive(string name,bool isActive)
{
GameObject go=scenes[name].gameObject;
if (go == null)
{
Debug.LogError("你要查的东西丢了");
return;
}
go.SetActive(isActive);
//if (go.activeSelf && !isActive)
//{
// go.SetActive(false);
//}
}
//通过名字获取字典中存入的scenes(panel)
public UIScene Getscene(string name)
{
if (scenes.ContainsKey(name)) {
return scenes [name];
}
return null;
}
public T Getscene<T>(string name)where T:Component
{
UIScene item = Getscene(name);
if (item!=null) {
return item.GetComponent<T> ();
}
return null;
}
/// <summary>
/// 开启一级界面
/// </summary>
public void ShowUI()
{
IsActive(UISceneName.Panel_Main, true);
}
}
UIScence子类
public class UIScenceFriend : UIScene {
private UITirggerListener mButton_return;
// Use this for initialization
void Start () {
base.Start ();
mButton_return = GetTrigger ("Button_return");
mButton_return.onClick += mButton_return_onClick;
}
public void mButton_return_onClick()
{
UIManager.instance.IsActive (UISceneName.Panel_Friend, false);
UIManager.instance.IsActive (UISceneName.Panel_Main, true);
}
// Update is called once per frame
void Update () {
}
}