u3d学习笔记二:unity事件机制的实现

事件机制广泛的存在于MVC架构中,事件机制的灵活性使我们的开发更为方便,下面对unity中事件机制的实现就个人的理解做一个简单的讲解:

一、直接绑定
  1. 直接创建button控件
  2. 创建testClick脚本,在里面创建一个OnClickHandler()的共有函数,并将脚本绑定在button控件中
  3. 点击按钮控件,找到下图所示的位置,点击加号,将按钮控件放入,然后设置相应函数,结果如下图所示
  4. 运行,onClickHandler函数就会相应点击操作(可以在函数中加上Debug.log(“”)来测试)
二、通过实现事件类接口来实现事件的监听
  1. 先创建一个按钮
  2. 创建脚本testClick,脚本实现IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IDragHandler等接口,并绑定到按钮上
  3. 运行,相应接口就能响应相应的操作(可以在函数中加上Debug.log(“”)来测试)
三、通过eventTrigger实现按钮事件的
  1. 创建一个按钮
  2. 点击按钮,在按钮上加一个EventTrigger,通过AddComponent->Event->EventTrigger添加,添加后如下图所示
  3. 创建脚本testClick,代码如下:
  4. 运行就可以响应相应的点击事件
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!");
    }
}
四、通过控件绑定增加监听的形式
  1. 同样是先创建一个按钮,并命名为你想要的名字,在下图位置修改命名
  2. 创建脚本testClick,并将脚本绑定在任意组件中,这个绑定不需要绑定到button上。
  3. 在脚本中获取按钮控件,并增加相应的时间监听,代码如下所示
  4. 运行就可以响应相应的点击事件
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!");
    }
}
总结

个人觉得最为方便和灵活的方法就是第四种,因为这种方法叫适合我之前的打码习惯吧,通过增加事件监听器来实现时间监听。
以上的都是自己使用的一些总结,如有不对或者错漏的地方,希望大大们不吝赐教,谢谢啦

猜你喜欢

转载自blog.csdn.net/zds_c/article/details/79975868