一、前言
今天分享一下UGUI Button绑定事件的几种方法,以及优点和缺点 有哪些地方不懂的小伙伴也可以联系我的QQ,我的QQ就在博客链接中隐藏着,看能不能找到咯
二、正文
我们先写一个Button的响应脚本ButtonTest.cs
代码语言:javascript复制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方法
代码:
代码语言:javascript复制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 = "鼠标点击";
}
}
三、通过射线监听点击到的物体来绑定事件
代码:
代码语言:javascript复制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 实现按钮点击事件
代码:
代码语言:javascript复制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响应事件
代码:
代码语言:javascript复制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
代码语言:javascript复制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 = "鼠标点击";
}
}