Unity3D插件 Doozy UI 学习(二):与DoozyUI的事件传递

前言

为了能让DoozyUI与项目本身可以兼容,至少需要做到以下两点:

1、通过DoozyUI 触发一个自定义的事件(比如通过点击按钮来开始游戏)。

2、通过其他模块的事件来触发DoozyUI(比如游戏失败弹出提示框)。

所以需要我们做的就是使DoozyUI与自己的逻辑互通,需要有一个中间类来传递消息。

 

通过DoozyUI向其他模块传递消息

 

1、使用UnityEvent

我们通过观察DoozyUI的结构,发现其预留了一个事件给我们:

Unity3D插件 Doozy UI 学习(二):与DoozyUI的事件传递_第1张图片

例如在UI Button中就有这么一个事件,我们可以像给普通按钮赋值一样给他赋值一个UnityEvent,然后就可以点击触发。我们可以以此为基础来实现从Doozy UI到项目的事件传递。

 

2、关于 UI Button的事件传递

DoozyUI给UI Button设定了7个事件,分别是:

OnPointerEnter(鼠标进入)、OnPointerExit(鼠标退出)、OnClick(单击)、OnPointerDown(按下)、OnPointerUp(抬起)、OnDoubleClick(双击)和OnLongClick(长按)。

因此我们写一个类,挂载到含有 UI Button的gameObject上面:

/// 
/// Dooozy UI 的事件帮助脚本;
/// 通过在UnityEvent来触发;
/// 
public class DoozyUIEventHelper_Button : MonoBehaviour
{
        UIButton mUIButton;

        private void OnEnable()
        {

        }

        private void Awake()
        {
            mUIButton = GetComponent();
            if (mUIButton != null)
            {
                InitEvent();
                //Debug.Log("添加各个事件!");
            }
            else
            {
                Debug.LogError("需要先添加DoozyUI.UIButton组件!");
            }
        }

        void InitEvent()
        {
            mUIButton.OnPointerEnter.AddListener(OnPointerEnter);
            mUIButton.OnPointerExit.AddListener(OnPointerExit);
            mUIButton.OnClick.AddListener(OnPointerClick);
            mUIButton.OnPointerDown.AddListener(OnPointerDown);
            mUIButton.OnPointerUp.AddListener(OnPointerUp);
            mUIButton.OnDoubleClick.AddListener(OnDoubleClick);
            mUIButton.OnLongClick.AddListener(OnLongClick);
        }

        private void OnDestroy()
        {
            if (mUIButton != null)
                RemoveEvent();
        }

        void RemoveEvent()
        {

        }

        public List ListPointerEnter = new List();
        /// 
        /// 进入;
        /// 
        public void OnPointerEnter()
        {
            if (mUIButton.useOnPointerEnter)
                DispatchCMD(ListPointerEnter);
        }

        public List ListPointerExit = new List();
        /// 
        /// 退出;
        /// 
        public void OnPointerExit()
        {
            if (mUIButton.useOnPointerExit)
                DispatchCMD(ListPointerExit);
        }

        public List ListPointerUp = new List();
        /// 
        /// 抬起;
        /// 
        public void OnPointerUp()
        {
            if (mUIButton.useOnPointerUp)
                DispatchCMD(ListPointerUp);
        }

        public List ListPointerDown = new List();
        /// 
        /// 按下;
        /// 
        public void OnPointerDown()
        {
            if (mUIButton.useOnPointerDown)
                DispatchCMD(ListPointerDown);
        }

        public List ListPointerClick = new List();
        /// 
        /// 点击事件;
        /// 
        public void OnPointerClick()
        {
            if (mUIButton.Interactable)
                DispatchCMD(ListPointerClick);
        }

        public List ListDoublePointerClick = new List();
        /// 
        /// 双击;
        /// 
        public void OnDoubleClick()
        {
            if (mUIButton.useOnDoubleClick)
                DispatchCMD(ListDoublePointerClick);
        }

        public List ListPointerLongClick = new List();
        /// 
        /// 长按;
        /// 
        public void OnLongClick()
        {
            if (mUIButton.useOnLongClick)
                DispatchCMD(ListPointerLongClick);
        }

        void DispatchCMD(List list)
        {
            int length = list.Count;
            for (int i = 0; i < length; i++)
            {
               Debug.log("触发:"+list[i]);
            }
        }
}

这里的原理就是用代码给 UI Button的各个UnityEvent添加事件。

其中E_UIEvent是我自己定义的一个枚举,用来当做各个事件的唯一ID。这样就可以通过UI Button来触发自定义的事件了,而且还可以一次性触发多个事件。

 

3、关于UI Element的事件传递

同理 UI Button,但是事件类型有些不一样。UI Element有四个事件:

OnInAnimationsStart(进入动画开始),OnInAnimationsFinish(进入动画结束),OnOutAnimationsStart(退出动画开始),OnOutAnimationsFinish(退出动画结束)。

代码如下:

    /// 
    /// Dooozy UI 的事件帮助脚本;
    /// 通过在UnityEvent来触发;
    /// 
    public class DoozyUIEventHelper_Element : SerializedMonoBehaviour
    {

        UIElement mUIElement;

        private void Awake()
        {
            mUIElement = GetComponent();
            if (mUIElement != null)
            {
                InitEvent();
                //Debug.Log("添加各个事件!");
            }
            else
            {
                Debug.LogError("需要先添加DoozyUI.UIElement!");
            }
        }

        void InitEvent()
        {
            mUIElement.OnInAnimationsStart.AddListener(OnInAnimationsStart);
            mUIElement.OnInAnimationsFinish.AddListener(OnInAnimationsFinish);
            mUIElement.OnOutAnimationsStart.AddListener(OnOutAnimationsStart);
            mUIElement.OnOutAnimationsFinish.AddListener(OnOutAnimationsFinish);
        }

        private void OnDestroy()
        {
            if (mUIElement != null)
                RemoveEvent();
        }

        void RemoveEvent()
        {

        }

        public List ListInAnimationsStart = new List();
        /// 
        /// 进入动画开始;
        /// 
        public void OnInAnimationsStart()
        {
            if (mUIElement.InAnimationsEnabled)
                DispatchCMD(ListInAnimationsStart);
        }

        public List ListInAnimationsFinish = new List();
        /// 
        /// 进入动画结束;
        /// 
        public void OnInAnimationsFinish()
        {
            if (mUIElement.InAnimationsEnabled)
                DispatchCMD(ListInAnimationsFinish);
        }

        public List ListOutAnimationsStart = new List();
        /// 
        /// 退出动画开始;
        /// 
        public void OnOutAnimationsStart()
        {
            if (mUIElement.OutAnimationsEnabled)
                DispatchCMD(ListOutAnimationsStart);
        }

        public List ListOutAnimationsFinish = new List();
        /// 
        /// 退出动画结束;
        /// 
        public void OnOutAnimationsFinish()
        {
            if (mUIElement.OutAnimationsEnabled)
                DispatchCMD(ListOutAnimationsFinish);
        }

        void DispatchCMD(List list)
        {
            int length = list.Count;
            for (int i = 0; i < length; i++)
            {
                Debug.Log(list[i].ToString());
            }
        }

    }

 

通过其他模块向DoozyUI传递消息

目前只看了一下如何打开/关闭一个UI元素。原理就是发消息至DoozyUI 的 UIMangaer,比较简单。

代码示例如下:

        /// 
        /// 展示一个UI元素;
        /// 
        /// 元素名
        /// 元素分类
        public static void ShowUIElement(string elementName, string elementCategory = DUI.UNCATEGORIZED_CATEGORY_NAME)
        {
            UIElement.ShowUIElement(elementName, elementCategory);
        }

        /// 
        /// 隐藏一个UI元素;
        /// 
        /// 元素名
        /// 元素分类
        /// 隐藏动画是否立即播放
        public void HideUIElement(string elementName, string elementCategory = DUI.UNCATEGORIZED_CATEGORY_NAME, bool instantAction = false)
        {
            UIElement.HideUIElement(elementName, elementCategory, instantAction);
        }

 

 

你可能感兴趣的:(Unity)