UI--

  • 层级管理
    ## 三级 ##
    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 () {

    }
}

猜你喜欢

转载自blog.csdn.net/fuliyefly/article/details/78429415
ui