【Unity3D ugui】事件监听机制

UGUI控件的事件响应有很多种方式,比如使用组件EventTrigger来添加事件监听,或者实现IDragHandler等接口,或者更直接地继承EventTrigger来进行更灵话的调用。

下面分别就上面3种监听方式进行讲解,这些例子都是实现拖动Image的功能。

一、使用组件EventTrigger来添加事件监听

添加一个脚本EventTriggerTest,挂到一个Image上。那么OK,现在可以拖动图片了。

using UnityEngine;
using UnityEngine.EventSystems;
using Framework;

public class EventTriggerTest : MonoBehaviour
{
	public void OnDrag(BaseEventData baseEventData)
	{
		PointerEventData data = baseEventData as PointerEventData;
		var rt = data.pointerPress.GetComponent<RectTransform>();
		Vector3 globalMousePos;
		if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, data.position, data.pressEventCamera, out globalMousePos))
		{
			rt.position = globalMousePos;
		}
	}
}


二、实现IDragHandler等接口

UGUI的所有接口如下

        IPointerEnterHandler,
        IPointerExitHandler,
        IPointerDownHandler,
        IPointerUpHandler,
        IPointerClickHandler,
        IInitializePotentialDragHandler,
        IBeginDragHandler,
        IDragHandler,
        IEndDragHandler,
        IDropHandler,
        IScrollHandler,
        IUpdateSelectedHandler,
        ISelectHandler,
        IDeselectHandler,
        IMoveHandler,
        ISubmitHandler,
        ICancelHandler
这里就实现IDragHandler接口,来实现Image的拖动。添加脚本EventInterfaceTest,挂到Image上。

using UnityEngine;
using UnityEngine.EventSystems;

class EventInterfaceTest : MonoBehaviour, IDragHandler
{
	public void OnDrag(PointerEventData data)
	{
		var rt = gameObject.GetComponent<RectTransform>();
		Vector3 globalMousePos;
		if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, data.position, data.pressEventCamera, out globalMousePos))
		{
			rt.position = globalMousePos;
		}
	}
}

三、继承EventTrigger来进行更灵话的调用

如果GameObject是动态创建的,那么就不方便用Unity编辑器加EventTrigger监听,所以要是能用代码方便地进行监听,又不需要重写那么多接口,那是最好不过了。

首先添加脚本UGUIEventTrigger

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;

namespace Framework
{
	public class UGUIEventTrigger : EventTrigger
	{
		public static UGUIEventTrigger Get(GameObject go)
		{
			UGUIEventTrigger trigger = go.GetComponent<UGUIEventTrigger>();
			if (null == trigger)
			{
				trigger = go.AddComponent<UGUIEventTrigger>();
			}
			return trigger;
		}

		public void AddEventListener(EventTriggerType eventTriggerType, UnityAction<BaseEventData> action)
		{
			EventTrigger.Entry entry = new EventTrigger.Entry();
			entry.eventID = eventTriggerType;
			entry.callback.AddListener(action);
			if (null == delegates)
			{
				delegates = new List<Entry>();
			}
			delegates.Add(entry);
		}
	}
}
然后编写测试脚本,挂到Image上。
using UnityEngine;
using UnityEngine.EventSystems;

public class UGUIEventTriggerTest : MonoBehaviour
{
	void Start()
	{
		UGUIEventTrigger.Get(gameObject).AddEventListener(EventTriggerType.Drag, OnDrag);
	}

	private void OnDrag(BaseEventData baseData)
	{
		PointerEventData data = baseData as PointerEventData;
		var rt = data.pointerPress.GetComponent<RectTransform>();
		Vector3 globalMousePos;
		if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, data.position, data.pressEventCamera, out globalMousePos))
		{
			rt.position = globalMousePos;
		}
	}
}




  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值