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就可以了.