UGUI的事件监听机制
来源:互联网 发布:编程方法学 编辑:程序博客网 时间:2024/05/22 01:57
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;
- }
- }
- }
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
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;
- }
- }
- }
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);
- }
- }
- }
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;
- }
- }
- }
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; } }}
0 0
- UGUI的事件监听机制
- UGUI-仿照NGUI的事件监听机制
- 【UGUI】UGUI的事件监听
- 【Unity3D ugui】事件监听机制
- UGUI的事件机制
- UGUI的按钮监听事件
- UGUI的点击事件机制
- 【Unity3D ugui】简单控件的事件监听
- UGUI 按钮的监听事件系统
- UGUI Toggle的监听事件绑定
- UGUI的按钮监听事件系统
- uGUI事件监听
- UGUI 按钮监听事件
- UGUI事件监听总结
- UGUI事件机制
- JS的事件监听机制
- JS的事件监听机制
- JS的事件监听机制
- 用遗传算法创造出最佳的汽车机器人---机器人越野小车
- AC自动机模版
- Activiti工作流引擎——数据库表结构说明
- 超星中职生安全教育答案
- flowable入门
- UGUI的事件监听机制
- 【2017最新完整】超星尔雅通识课木与人类文明答案
- DBA_HIST_SYSMETRIC_SUMMARY中的Network Traffic Volume Per Sec 指标是指什么?
- spring---整合Junit,整合web
- caffe-windows(仅cpu)配置过程
- 除夕和春节
- +-字符串
- usaco street race(dfs)
- leetcode 3. Longest Substring Without Repeating Characters