事件机制广泛的存在于MVC架构中,事件机制的灵活性使我们的开发更为方便,下面对unity中事件机制的实现就个人的理解做一个简单的讲解:
一、直接绑定
- 直接创建button控件
- 创建testClick脚本,在里面创建一个OnClickHandler()的共有函数,并将脚本绑定在button控件中
- 点击按钮控件,找到下图所示的位置,点击加号,将按钮控件放入,然后设置相应函数,结果如下图所示
- 运行,onClickHandler函数就会相应点击操作(可以在函数中加上Debug.log(“”)来测试)
二、通过实现事件类接口来实现事件的监听
- 先创建一个按钮
- 创建脚本testClick,脚本实现IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IDragHandler等接口,并绑定到按钮上
- 运行,相应接口就能响应相应的操作(可以在函数中加上Debug.log(“”)来测试)
三、通过eventTrigger实现按钮事件的
- 创建一个按钮
- 点击按钮,在按钮上加一个EventTrigger,通过AddComponent->Event->EventTrigger添加,添加后如下图所示
- 创建脚本testClick,代码如下:
- 运行就可以响应相应的点击事件
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class ClickTest : MonoBehaviour
{
private bool isCanMove = false;
// 仅在首次调用 Update 方法之前调用 Start
private void Start()
{
EventTrigger trigger = transform.gameObject.GetComponent<EventTrigger>();
if (trigger == null)
{
trigger = transform.gameObject.AddComponent<EventTrigger>();
}
trigger.triggers = new List<EventTrigger.Entry>();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerClick;
entry.callback = new EventTrigger.TriggerEvent();
UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(OnClickHandler);
entry.callback.AddListener(callback);
trigger.triggers.Add(entry);
}
public void OnClickHandler(BaseEventData eventData)
{
isCanMove = !isCanMove;
Debug.Log("this is a test!");
}
}
四、通过控件绑定增加监听的形式
- 同样是先创建一个按钮,并命名为你想要的名字,在下图位置修改命名
- 创建脚本testClick,并将脚本绑定在任意组件中,这个绑定不需要绑定到button上。
- 在脚本中获取按钮控件,并增加相应的时间监听,代码如下所示
- 运行就可以响应相应的点击事件
using UnityEngine;
using UnityEngine.UI;
public class ClickTest : MonoBehaviour
{
public GameObject sphere;
public Button startBtn;
private bool isCanMove = false;
// 仅在首次调用 Update 方法之前调用 Start
private void Start()
{
GameObject btn = GameObject.Find("startBtn");
startBtn = btn.GetComponent<Button>();
startBtn.onClick.AddListener(delegate ()
{
this.OnClickHandler();
});
}
// 如果 MonoBehaviour 已启用,则在每一帧都调用 Update
private void Update()
{
if (isCanMove)
{
sphere.transform.Translate(Vector3.right *Time.deltaTime*1);
sphere.transform.Translate(Vector3.up * Time.deltaTime* 1);
}
}
private void OnClickHandler()
{
isCanMove = !isCanMove;
Debug.Log("this is a test!");
}
}
总结
个人觉得最为方便和灵活的方法就是第四种,因为这种方法叫适合我之前的打码习惯吧,通过增加事件监听器来实现时间监听。
以上的都是自己使用的一些总结,如有不对或者错漏的地方,希望大大们不吝赐教,谢谢啦