赞
踩
Drag滑动事件主要有四个event他们分别是:
IInitializePotentialDragHandler, 初始化,鼠标最对应地方摁下出发(鼠标Down)每次点击触发一次
IBeginDragHandler, 鼠标移动出发,第一下移动触发一次
IDragHandler, 一直 触发
IEndDragHandler 结束(鼠标Up)鼠标点击松开触发一次
总的来说就是看图:
主要是实现方式也是认为为继承接口
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class s3Test : MonoBehaviour,IInitializePotentialDragHandler,IBeginDragHandler,IDragHandler,IEndDragHandler // { public void OnBeginDrag(PointerEventData eventData) { Debug.Log("BeginDrag"); } public void OnDrag(PointerEventData eventData) { Debug.Log("OnDrag"); } public void OnEndDrag(PointerEventData eventData) { Debug.Log("EndDrag"); } public void OnInitializePotentialDrag(PointerEventData eventData) { Debug.Log("initialDrag"); } }
而且他们站之间有依赖关系另外三个都需要依赖于OnDrag。没有他,另外i三个都是无法触发的.
那么我们来实现一个简单的拖拽物体功能
并且添加了一个小优化:就是我们拖拽物体移动之后,物体或默认的移动到中央位置.这个是不美观的,我们记录一下偏移量,然后吧偏移转入物体看代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class s3Test : MonoBehaviour,IInitializePotentialDragHandler,IBeginDragHandler,IDragHandler,IEndDragHandler // { Vector3 offset;//记录偏移 public void OnBeginDrag(PointerEventData eventData) { //在一开始的时候就记录好偏移量 Debug.Log("BeginDrag"); var rect = GetComponent<RectTransform>(); offset = Vector3.zero; Vector3 pos = Vector3.zero; //这里多提以一下,因为我们在做UI的时候很多东西都是会让人迷糊的, //位置处理很多时候都会不适配,所以一定要调好函数,不然就会出现偏差 //来自蒟蒻的提醒 //该函数能够将鼠标位置转化为世界坐标 //ps:还有screenpointToWorldPostion RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.enterEventCamera, out pos); offset = pos - rect.position; Debug.Log(offset); } public void OnDrag(PointerEventData eventData) { var rect = GetComponent<RectTransform>(); Vector3 pos = Vector3.zero; RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.enterEventCamera, out pos); rect.position = pos-offset; } public void OnEndDrag(PointerEventData eventData) { Debug.Log("EndDrag"); } public void OnInitializePotentialDrag(PointerEventData eventData) { Debug.Log("initialDrag"); } }
最后面们看一个扩展
这个是在当鼠标松开的时候在执行,而且他的执行是在EndDrag后面执行的
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class s3Test : MonoBehaviour,IDragHandler,IDropHandler //, IInitializePotentialDragHandler, IBeginDragHandler, IEndDragHandler // { Vector3 offset; public void OnDrag(PointerEventData eventData) { var rect = GetComponent<RectTransform>(); Vector3 pos = Vector3.zero; RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.enterEventCamera, out pos); rect.position = pos - offset; } public void OnDrop(PointerEventData eventData) { Debug.Log("Drop"); //throw new System.NotImplementedException(); } }
Drag遇见问题
拖拽物体的层级导致事件响应出错
说明:我们拖拽的物体应该默认为最高层级的
可以给他添加一个canvas,和graphic raycaster,勾选Override Sorting,并设置Sort Order就可以了.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。