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

前言

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

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

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

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

 

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

 

1、使用UnityEvent

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

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

 

2、关于 UI Button的事件传递

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

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

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

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

        private void OnEnable()
        {

        }

        private void Awake()
        {
            mUIButton = GetComponent<UIButton>();
            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<E_UIEvent> ListPointerEnter = new List<E_UIEvent>();
        /// <summary>
        /// 进入;
        /// </summary>
        public void OnPointerEnter()
        {
            if (mUIButton.useOnPointerEnter)
                DispatchCMD(ListPointerEnter);
        }

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

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

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

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

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

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

        void DispatchCMD(List<E_UIEvent> 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(退出动画结束)。

代码如下:

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

        UIElement mUIElement;

        private void Awake()
        {
            mUIElement = GetComponent<UIElement>();
            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<E_UIEvent> ListInAnimationsStart = new List<E_UIEvent>();
        /// <summary>
        /// 进入动画开始;
        /// </summary>
        public void OnInAnimationsStart()
        {
            if (mUIElement.InAnimationsEnabled)
                DispatchCMD(ListInAnimationsStart);
        }

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

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

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

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

    }

 

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

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

代码示例如下:

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

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

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DoozyUI 是一个原生 Unity 编辑器的扩展工具,可简化专业用户界面的管理和动画绘制 - 无需编程知识。DoozyUI 方便初学者并可扩展,适合从业余开发者到专业软件和游戏工作室之间所有阶段的人员使用。 UI 的管理和动画绘制曾经只有经验丰富的开发者才会做。多亏了 DoozyUI,现在任何人都能创建自己的原生 Unity UI。无论你的能力到哪,DoozyUI 的强大编辑器都能给予你充分的创意掌控 - 连一条代码都不需要写。而且,如果你喜欢编程的话,随时找到一个专业API (Application Programming Interface) 就可下手。 随着众多视频教程可用,你很快就能自己创建第一个 UI。开始创造并把你的点子带到世界! 自从 2015 年以来我们一直都在开发这个系统,当它第一次在 Unity 资源商店上发布时,我们有许多对于前景的展望和计划。创作此产品时,倾注了很多思考、工作和热爱,我们非常希望你能喜欢它。 功能特色 - 使用原生 uGUI - 容易学。直观设计 - 原生编辑器集成 - 节点图 UI 导航流程 - 主题管理系统 - 自动音源汇集 - 触摸感应器 - 方向感应器 - 支持所有平台 - 独立解像 - 支持移动设备 - 编辑器内文档链接 - 可搜索文档 - 视频教程 - 专门团队支持 - 整洁代码。容易理解、修改和测试。 - 提供了完整的 C#源代码 :: 快速设置 - 设置起来快捷方便,一接上就能播放。直观的控制界面意味着快捷的调控和优化的工作流程,以便你有更多时间来做重要的事情。 :: 主题管理器- 利用自动主题/皮肤管理系统改变应用/游戏的外观 :: 独立解像 - UI Animator 计算所有的分辨率和高宽比值并相应地调整动画。因此所有的动画在横向和纵向模式都感觉看起来一样。 :: 进度条 - 是的!创建你想象中任何一种进度指示器,并将它动画绘制,而且不需要代码就可以控制它。 :: 节省时间 - 把你的动画保存起来并将它们加载到其他项目。(资源文件) :: 有趣 - 在播放模式中创建各种动画,并将它们保存到任何项目中。(通过 DoozyUI) :: 简单 - 不需要代码通过 WYSIWYG 途径就能创建直观的菜单。 :: 全方位操控 - 细调所有动画设置,从定时到延迟和简便功能。 组件 - 返回按钮 - 色彩目标图像 - 色彩目标 ParticleSystem - 色彩目标原始图像 - 色彩目标 SpriteRenderer - 色彩目标文本 - 色彩目标 TextMeshPro - 字体目标文本 - 字体目标 TextMeshPro - 游戏事件监听器 - 游戏事件管理器 - 手势监听器 - 图形控制器 - 行动键 - 游戏事件键 - 方向感应器 - 进展目标行动 - 进展目标动画器 - 进展目标混音器 - 进展目标图像 - 进展目标文本 - 进展目标 TextMeshPro - 进展器 - 进展器组 - 径向布局 - 场景指导器 - 场景加载器 - Soundy 控制器 - Soundy 管理器 - Soundy 汇集器 - Sprite 目标图像 - Sprite 目标 SpriteRenderer - 纹理目标原始图像 - 主题管理器 - 触摸感应器 - UI 按钮 - UI 按钮监听器 - UI 画布 - UI 绘画器 - UI 绘画器监听器 - UI 弹出功能 - UI 弹出功能管理器 - UI 切换 - UI 视角 - UI 视角监听器 ------ NODY - 一个节点图像引擎,从可连成图像的模块节点组件上构建而成。作为系统的一个重要部分,Nody 是专门设计用来创作、视觉化和 UI 导航流程的管理。 - 图形控制器 - 图形/子图形 节点 - UI 节点 - 游戏事件节点 - 声音节点 - 子图形节点 - 主题节点 - 后退按钮节点 - 门户节点 - 切回节点 - UI 绘画器节点 - 启动已载入场景节点 - 加载场景节点 - 卸载场景节点 - 程序退出节点 - 随机节点 - 时间标度节点 - 等待节点 - 开始节点 - 进入节点 - 退出节点 ------ SOUNDY - 一个能与 DoozyUI 并肩使用的复杂音效管理系统。它能从自己的声音数据库里播放音效,也能直接引用 AudioClip,或通过 MasterAudio(第三方插件)播放。它还设有一个自动化音效检测系统,无需任何外部管理。 - Soundy 管理器 - Soundy 汇集器 - Soundy 控制器 ------ TOUCHY - 一个附带 DoozyUI 的触摸感应系统。捕捉来自 Unity 原生输入解析的触击(和点击)并将其一些额外信息一起传递到系统中。 - 触摸感应器 - 手势监听器 ------ 集成 - Playmaker - MasterAudio - TextMeshPro ------ 重要 DoozyUI 第 3 版与第 2 版不兼容。它们看起来也许很相似,但是代码库大不相同。基本上第 3 版是受第 2 版启发的一款全新的软件。因此它们之间无法兼容。 要求 在安装 DoozyUI 之前需要先安装 DOTween 并执行初始设置。 DOTween 的最低版本要求是 v1.2.235 DOTween 下载链接: https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676 准备就绪 在导入 DoozyUI 后,它将执行初始设置,然后就可以开始使用。 DoozyUI 的控制面板能从 Tools>Doozy>Control Panel(或使用 Alt+D 快捷键)打开。 DoozyUI 的 Nody 窗口能从 Tools>Doozy>Nody 中打开
Doozy UI是一个成熟的商业插件,它的体系相对来说是非常复杂的,需要阅读很多代码来理解。但作为一个开源插件,也可以逐步学习,不需要一次性全部掌握。可以先上手使用,逐渐学习其中的功能和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Unity3D插件 Doozy UI 学习(一):打开一个面板](https://blog.csdn.net/cyf649669121/article/details/86028170)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Unity3D插件 Doozy UI 学习):与DoozyUI事件传递](https://blog.csdn.net/cyf649669121/article/details/86239288)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Unity3D插件 Doozy UI 学习(三):UI Element](https://blog.csdn.net/cyf649669121/article/details/102517286)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值