当前位置:   article > 正文

【Unity】在UI上实现拖拽功能(IBeginDragHandler, IDragHandler,IEndDragHandler)_unity ibegindraghandler

unity ibegindraghandler

1.效果展示

请添加图片描述

2.接口API

IBeginDragHandler、IDragHandler 和 IEndDragHandler 是 Unity 引擎中的三个接口,用于处理 UI 元素的拖动事件。

  • 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;
	}
 
}




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/656848
推荐阅读
相关标签
  

闽ICP备14008679号