【Unity3D ugui】事件监听机制
2015-06-11 21:28
513 查看
UGUI控件的事件响应有很多种方式,比如使用组件EventTrigger来添加事件监听,或者实现IDragHandler等接口,或者更直接地继承EventTrigger来进行更灵话的调用。
下面分别就上面3种监听方式进行讲解,这些例子都是实现拖动Image的功能。
一、使用组件EventTrigger来添加事件监听
添加一个脚本EventTriggerTest,挂到一个Image上。那么OK,现在可以拖动图片了。
二、实现IDragHandler等接口
UGUI的所有接口如下
三、继承EventTrigger来进行更灵话的调用
如果GameObject是动态创建的,那么就不方便用Unity编辑器加EventTrigger监听,所以要是能用代码方便地进行监听,又不需要重写那么多接口,那是最好不过了。
首先添加脚本UGUIEventTrigger
下面分别就上面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; } } }
相关文章推荐
- unity, 相机空间 与 相机gameObject的局部空间
- VMware Ubuntu虚拟机无法进入Unity模式的解决方法
- Unity项目内各种文件的作用
- UnityVS(Visual Studio Tools For Unity)的安装与使用
- Unity Shader Lab
- unity, WaterProDaytime注意事项。
- unity, 欧拉角(euler angle)
- unity, mono断点
- Unity Ugui EventListen (事件侦听)
- 关于Unity4.6.1 和 ios 64bit
- Unity3d 寻路组件NavMesh Agent
- [UnityShader]顶点片段着色器实例(三)
- unity CharacterMotor 中按下shift 实现加速
- 猫都能学会的Unity3D Shader入门指南(一)
- Unity3D中世界坐标转换到NGUI世界坐标
- Unity5.0.2正式版
- unity3d插入android有米广告
- Unity 5.1 重大发布,新功能全力支持VR开发!
- Unity4.6 Build APK之后 Normal Map颜色不对
- c#中反射技术在Unity中的运用