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

这篇具有很好参考价值的文章主要介绍了【Unity】在UI上实现拖拽功能(IBeginDragHandler, IDragHandler,IEndDragHandler)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.效果展示

unity ibegindraghandler,Unity 程序设计,unity,ui,游戏引擎

2.接口API

IBeginDragHandler、IDragHandler 和 IEndDragHandler 是 Unity 引擎中的三个接口,用于处理 UI 元素的拖动事件。文章来源地址https://www.toymoban.com/news/detail-855464.html

  • IBeginDragHandler:开始拖动时调用
  • IDragHandler:正在拖动时调用
  • IEndDragHandler:拖动结束时调用
    unity ibegindraghandler,Unity 程序设计,unity,ui,游戏引擎在脚本中加入如下三个方法
    unity ibegindraghandler,Unity 程序设计,unity,ui,游戏引擎

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity中 使用IDragHandler拖动交换子物体

    using DG.Tweening; using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using VRSightCheck.Scripts; public class SwapPanel : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {     /// summary     /// 是否已经响应拖拽     /// /summary     public static bool isDrag = false;     priv

    2024年02月05日
    浏览(28)
  • 【Unity实现背包拖拽功能 】

    Unity实现背包拖拽功能 可以实现背包拖拽交换位置、合成 等一系列功能的实现

    2024年02月12日
    浏览(44)
  • Unity打包窗口化放大、缩小、拖拽功能、无边框设置 C#

    Unity无边框设置、窗口化放大、缩小、拖拽 提示:PC端打包,测试尽量在打包后测试。 编辑器下测试会有意想不到的后果呦~~ [DllImport(\\\"user32.dll\\\")] 。 代码如下: 代码如下:注释详细,不懂就问哈 代码整体已贴出,功能亲测可用,欢迎学习交流。点赞+收藏+关注哦~

    2024年02月16日
    浏览(39)
  • unity2d里实现鼠标拖拽物体的功能

    在 Unity 中实现鼠标拖拽物体的功能需要使用到 Unity 的 Physics 系统。 要实现鼠标拖拽物体,你需要在场景中添加以下内容: 一个 Rigidbody 2D 组件,用于控制物体的运动。 一个 Box Collider 2D 组件,用于检测鼠标与物体的碰撞。 一个脚本,用于监听鼠标的输入,并在鼠标按下时拖

    2024年02月11日
    浏览(31)
  • Unity3D实现背包系统、物品的拖拽、拾取物品功能

    要在Unity中实现背包系统,你可以创建一个脚本来管理库存和物品。 首先,在Unity中创建一个名为“InventoryManager”的C#脚本。在这个脚本中,你可以创建一个将存储在背包中的物品列表。

    2024年02月16日
    浏览(34)
  • 在unity中实现视频的暂停播放和拖拽进度条的功能

    #Unity中实现视频的暂停播放和拖拽进度条的功能 在UI上,视频包含一个播放、暂停和停止按钮,以及一个拖动条,可以使用这些按钮来控制视频的播放,使用拖动进度条来调整视频的播放进度。 1.建立一个UI,导入视频素材,然后将视频拖放到场景中。 2.建立一个Canvas对象作

    2024年02月07日
    浏览(38)
  • Unity之XR Interaction Toolkit如何在VR中实现一个可以拖拽的UI

    普通的VR项目中,我们常见的UI都是一个3D的UI,放置在场景中的某个位置,方便我们使用射线点击。但是为了更好的体验,我们可能会有跟随头显的UI,或者可拖拽的UI,这样更方便用户去操作。 所以我们今天的需求就是:如何基于XR Interaction Toolkit 插件 在VR中使用手柄射线来

    2024年02月19日
    浏览(27)
  • 基于vue element-ui 封装上传图片组件 功能:上传,删除,预览,上传图片水印,拖拽排序,上传进度条等

    我们在开发后台时肯定避免不了上传图片的功能 例如: 上传图片回显 上传完成 : 预览查看 , 删除等 如果是图片列表,还可能让你拖动图片排序 有的后台项目可能要给图片添加水印,添加标记 有的后台可能要炫酷一点 添加进度条功能 现在我们要完成上面的一系列功能,这里我

    2024年02月16日
    浏览(48)
  • 如何在pycharm里边配置pyqt5、qt5-applications,使用拖拽功能设计UI界面

    安装pyqt5和qt5-applications 网上很多说要安装pyqt5-tools,但是里边并没有找到designer.exe这个文件,最终是在qt5-applications里边的Qt/bin找到了designer.exe文件。 在pycharm中配置designer working directory可以自己手动配置工程目录,也可以直接点击后面的按钮选择$ProjectFileDir$ 在pycharm中配置p

    2024年02月02日
    浏览(34)
  • Unity UI -- (5)增加基础按钮功能

            良好的UI设计会清晰地和用户沟通。用户知道他们能和屏幕上哪些东西交互,哪些不能。如果他们进行了交互,他们也要清楚地知道交互是否成功。换句话说,UI要提供给用户很多反馈。         我们可以来看看在Unity里或者在计算机上的任何应用程序:         将

    2024年02月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包