UGUI系列-Button绑定事件的多种实现

简介: 今天分享一下UGUI Button绑定事件的几种方法,以及优点和缺点 有哪些地方不懂的小伙伴也可以联系我的QQ,我的QQ就在博客链接中隐藏着,看能不能找到咯

一、前言

今天分享一下UGUI Button绑定事件的几种方法,以及优点和缺点 有哪些地方不懂的小伙伴也可以联系我的QQ,我的QQ就在博客链接中隐藏着,看能不能找到咯


二、正文

我们先写一个Button的响应脚本ButtonTest.cs

using UnityEngine;
using UnityEngine.UI;
public class ButtonTest : MonoBehaviour
{
    public Text m_Text;
    public void ButtonOnClickEvent()
    {
        m_Text.text = "鼠标点击";
    }
}
复制代码


一、可视化创建及事件绑定

点击Button组件上的OnClick的+号

网络异常,图片无法展示
|

然后把绑定脚本的对象,赋值到这个Button组件上

网络异常,图片无法展示
|

网络异常,图片无法展示
|


二、通过直接绑定脚本来绑定事件

使用Button组件自带的onClick.AddListener方法

代码:

using UnityEngine;
using UnityEngine.UI;
public class ButtonTest : MonoBehaviour
{
    public Button m_Button;
    public Text m_Text;
    void Start()
    {
        m_Button.onClick.AddListener(ButtonOnClickEvent);
    }
    public void ButtonOnClickEvent()
    {
        m_Text.text = "鼠标点击";
    }
}
复制代码

网络异常,图片无法展示
|


三、通过射线监听点击到的物体来绑定事件

代码:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ButtonTest : MonoBehaviour
{
    public Text m_Text;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (OnePointColliderObject() != null)
            {
                if (OnePointColliderObject().name == "Button" || OnePointColliderObject().name == "Text")
                {
                    ButtonOnClickEvent();
                }
            }
        }
    }
    //点击对象获取到对象的名字
    public GameObject OnePointColliderObject()
    {
        //存有鼠标或者触摸数据的对象
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        //当前指针位置
        eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
        //射线命中之后的反馈数据
        List<RaycastResult> results = new List<RaycastResult>();
        //投射一条光线并返回所有碰撞
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
        //返回点击到的物体
        if (results.Count > 0)
            return results[0].gameObject;
        else
            return null;
    }
    public void ButtonOnClickEvent()
    {
        m_Text.text = "鼠标点击";
    }
}
复制代码

网络异常,图片无法展示
|


四、通过 EventTrigger 实现按钮点击事件

网络异常,图片无法展示
|

代码:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[RequireComponent(typeof(EventTrigger))]
public class ButtonTest : MonoBehaviour
{
    public Text m_Text;
    void Start()
    {
        Button btn = transform.GetComponent<Button>();
        EventTrigger trigger = btn.gameObject.GetComponent<EventTrigger>();
        EventTrigger.Entry entry = new EventTrigger.Entry
        {
            // 鼠标点击事件
            eventID = EventTriggerType.PointerClick,
            // 鼠标进入事件 entry.eventID = EventTriggerType.PointerEnter;
            // 鼠标滑出事件 entry.eventID = EventTriggerType.PointerExit;
            callback = new EventTrigger.TriggerEvent()
        };
        entry.callback.AddListener(ButtonOnClickEvent);
        // entry.callback.AddListener (OnMouseEnter);
        trigger.triggers.Add(entry);
    }
    public void ButtonOnClickEvent(BaseEventData pointData)
    {
        m_Text.text = "鼠标点击";
    }
}
复制代码

网络异常,图片无法展示
|


五、通过通用类 UIEventListener 来处理Button响应事件

代码:

using UnityEngine;
using UnityEngine.EventSystems;
public class UIEventListener : MonoBehaviour, IPointerClickHandler
{
    // 定义事件代理
    public delegate void UIEventProxy();
    // 鼠标点击事件
    public event UIEventProxy OnClick;
    public void OnPointerClick(PointerEventData eventData)
    {
        if (OnClick != null)
            OnClick();
    }
}
复制代码

ButtonTest.cs

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[RequireComponent(typeof(EventTrigger))]
public class ButtonTest : MonoBehaviour
{
    public Text m_Text;
    void Start()
    {
        Button btn = this.GetComponent<Button>();
        UIEventListener btnListener = btn.gameObject.AddComponent<UIEventListener>();
        btnListener.OnClick += delegate () {
            ButtonOnClickEvent();
        };
    }
    public void ButtonOnClickEvent()
    {
        m_Text.text = "鼠标点击";
    }
}
复制代码

网络异常,图片无法展示
|



相关文章
|
7月前
|
JavaScript 前端开发
事件绑定(onmouseout,onmouseover)
事件绑定(onmouseout,onmouseover)
45 0
element-ui框架的el-dialog弹出框被遮罩层挡住了/el-drawer....会生成v-model元素的组件被遮罩层挡住
element-ui框架的el-dialog弹出框被遮罩层挡住了/el-drawer....会生成v-model元素的组件被遮罩层挡住
453 1
element-ui框架的el-dialog弹出框被遮罩层遮挡问题
element-ui框架的el-dialog弹出框被遮罩层遮挡问题
575 0
|
JavaScript
Vue 实现 Hover 功能( mouseover 与 mouseenter 的区别)
Vue 实现 Hover 功能( mouseover 与 mouseenter 的区别)
341 0
element-ui框架的el-dialog弹出框被遮罩层挡住了
element-ui框架的el-dialog弹出框被遮罩层挡住了
345 0
element-ui框架的el-dialog弹出框被遮罩层挡住了
|
Windows
Winform控件Button及控件的鼠标事件介绍
按钮控件是最常用的,用于实现点击完成操作。其主要处理的就是鼠标点击Click事件。由此可以引发出所有与鼠标有关的事件.....
1361 0
Winform控件Button及控件的鼠标事件介绍
|
iOS开发
SwiftUI极简教程08: Button按钮的使用
SwiftUI极简教程08: Button按钮的使用
1334 0
SwiftUI极简教程08: Button按钮的使用
SwiftUI—Button按钮控件的使用
SwiftUI—Button按钮控件的使用
521 0
SwiftUI—Button按钮控件的使用
element-ui:el-dialog遮罩层变黑
element-ui:el-dialog遮罩层变黑
555 0