当前位置:网站首页>UGUI系列-Button绑定事件的多种实现
UGUI系列-Button绑定事件的多种实现
2022-08-07 09:56:00 【恬静的小魔龙】
一、前言
今天分享一下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 = "鼠标点击";
}
}边栏推荐
- npm 发布问题
- leetcode 26. 删除有序数组中的重复项(实现unique函数)
- Assignment of major and minor device numbers for character devices
- MySQL advanced (twenty-eight) GRANT REVOKE usage details
- Query disk usage of files and directories
- [Punctuality Atom STM32 Serial] Chapter 7 Understanding the HAL Library Excerpted from [Punctual Atom] MiniPro STM32H750 Development Guide_V1.1
- 【Autosar 存储栈Memery Stack 4.Tc397的Flash编程】
- IMO模型编程思维法(Input-Model-Output)
- Unity 3D game general system settings page, custom key settings, background blur, image settings, brightness, contrast, saturation, volume adjustment, resolution windowing, frame rate vertical sync, a
- 3.ROS通信机制进阶
猜你喜欢
![[.NET6+Modbus] Modbus TCP protocol analysis, simulation environment and basic communication based on .NET](/img/f6/33f78eb57594edbddb64a6b7445b82.png)
[.NET6+Modbus] Modbus TCP protocol analysis, simulation environment and basic communication based on .NET

自定义推送铃声插件遇到的问题

Mastering Andriod Reverse in 100 Days - Day 1: ADB Principles and Common Commands

During the meeting, I was scolded by the leader for more than 10 minutes. The scolding made me almost cry, and my voice was shaking.

VPC5021电流模式 PWM 控制器 3uA 超低启动电流

微突发丢包的艺术

Flask框架——应用错误处理

thinkphp 6.x arbitrary file write vulnerability

Redis是单线程的,但Redis为什么这么快?

The non-professional AI brother is on fire: he doesn't have an ML degree, but he got an offer from DeepMind
随机推荐
思维和方法:冯诺依曼代码分析法:高效阅读理解和写代码
查询文件和目录的磁盘使用
简化理解:发布订阅
Flask Framework - Application Error Handling
Unity 3D 游戏通用系统设置页面,自定义按键设置,背景虚化,图像设置,亮度对比度饱和度音量调节,分辨率窗口化,帧率垂直同步,抗锯齿,阴影质量,纹理质量设置
Today's sleep quality record 74 points
中国手机持续创新,全面屏再进一步,引领手机创新
[.NET6+Modbus] Modbus TCP protocol analysis, simulation environment and basic communication based on .NET
process scheduling
2022牛客多校联赛第六场 题解
为了高性能、超大规模的模型训练,这个组合“出道”了
Flask框架——基于类的视图
1324_FreeRTOS队列创建函数实现分析
发现一款好用到爆的数据库工具,被惊艳到了
【.NET6+Modbus】Modbus TCP协议解析、仿真环境以及基于.NET实现基础通信
Mastering Andriod Reverse in 100 Days - Day 1: ADB Principles and Common Commands
thinkphp 6.x arbitrary file write vulnerability
Query disk usage of files and directories
window.requestAnimationFrame Web3D渲染帧率控制
Niu Ke Duo School-Eezie and Pie- (multiplication + difference on the tree)