您的位置:首页 > 移动开发 > Unity3D

【Unity3D ugui】事件监听机制

2015-06-11 21:28 513 查看
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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: