1.效果展示
文章来源:https://www.toymoban.com/news/detail-855464.html
2.接口API
IBeginDragHandler、IDragHandler 和 IEndDragHandler 是 Unity 引擎中的三个接口,用于处理 UI 元素的拖动事件。文章来源地址https://www.toymoban.com/news/detail-855464.html
- IBeginDragHandler:开始拖动时调用
- IDragHandler:正在拖动时调用
- IEndDragHandler:拖动结束时调用
在脚本中加入如下三个方法
3.PointerEventData属性
- button:触发此事件的按钮
- clickCount:计算按钮连击次数,间隔时间很短
- clickTime:上次发送点击事件的时间。这个时间不是每一次点击都是从新开始计算,会根据上一次的时间继续累加
- delta:自上次更新以来的鼠标坐标增量变化
- dragging:判断当前按钮是否在拖动
- enterEventCamera:与最后一个OnPointerEnter事件关联的相机,这个主要用于多相机混合的时候判断当前按钮的事件是由哪个相机触发的
- hovered:悬停堆栈中的对象列表。
- lastPress:最后一次按下事件的物体,这个会记录上一次点击到的按钮信息
- pointerCurrentRaycast:包含当前响应射线检测事件的信息
- pointerDrag:当前触发 OnDrag事件的物体,设置为空的时候不再触发OnDrag和OnEndDrag
- pointerEnter:当前触发OnPointerEnter的对象,一般鼠标移动到ui上的时候会触发这个事件,对应的是OnPointerExit,鼠标移出的时候
- pointerId:鼠标点击时的id(-1,-2,-3分别对应鼠标左键,右键和中键,手机端触摸时也有相应的id)
- pointerPress:鼠标按下时的游戏物体
- pointerPressRaycast:指针按下时响应射线检测的ui
- position:当前指针的位置,返回一个vector2向量。这是一个屏幕坐标,左下角为原点(0,0),右上角为(屏幕宽,屏幕高)
- pressEventCamera:与最后一个OnPointerPress事件关联的相机。
- pressPosition:按下的时候的指针位置
- rawPointerPress:当前执行事件中的物体,不论是否处理按下事件,都会保存指针按下时的游戏物体.
4.脚本逻辑
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Drag : MonoBehaviour ,IBeginDragHandler, IDragHandler,IEndDragHandler
{
//场景中的canvas
public Canvas canv;
RectTransform dragObjRect = null;
//拖拽的ui
public RectTransform dragUI;
//是否能拖拽
public bool canDrag = false;
void Start()
{
dragObjRect = canv.transform as RectTransform;
}
开始拖拽
public void OnBeginDrag(PointerEventData eventData)
{
//这里可以写一些过滤条件,比如只拖拽tag为item的物体
if (eventData.pointerEnter.tag == "item")
{
canDrag = true;
dragUI = eventData.pointerEnter.GetComponent<RectTransform>();
}
else
{
canDrag = false;
}
}
//拖拽中
public void OnDrag(PointerEventData eventData)
{
if (!canDrag)
return;
Vector3 globalMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle
(dragObjRect, eventData.position, eventData.pressEventCamera, out globalMousePos))
{
dragUI.position = globalMousePos;
dragUI.rotation = dragObjRect.rotation;
CheckPos();
}
}
//拖拽结束
public void OnEndDrag(PointerEventData eventData)
{
canDrag = false;
dragUI = null;
}
//检查位置,如果拖拽超出指定区域,则重新赋值
void CheckPos()
{
Vector2 pos = dragUI.anchoredPosition;
if (pos.x <= -150)
{
pos.x = -150;
}
else if (pos.x >= 150)
{
pos.x = 150;
}
else if (pos.y >= 40)
{
pos.y = 40;
}
else if (pos.y <= -40)
{
pos.y = -40;
}
dragUI.anchoredPosition = pos;
}
}
到了这里,关于【Unity】在UI上实现拖拽功能(IBeginDragHandler, IDragHandler,IEndDragHandler)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!