unity UI框架

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框架
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值