Unity开箱即用的UGUI面板的拖拽移动功能

news2024/11/19 12:42:17

文章目录

      • 👉一、背景
      • 👉二、效果图
      • 👉三、原理
      • 👉四、核心代码
      • 👉五,总结

👉一、背景

之前做PC项目时常常有面板拖拽移动的需求,今天总结封装一下,做成一个随时随地可复用的拖拽面板功能。

👉二、效果图

请添加图片描述

👉三、原理

实现原理也非常简单。首先继承UI事件系统下的两个接口:

IBeginDragHandler, IDragHandler

进而实现两个接口方法即可,主要是在开始拖拽事件里面,记录鼠标按下的坐标mMouseDownPosition和面板的初始坐标mPanelOriginPosition;然后在拖拽过程中鼠标在Canvas下的坐标,减去开始拖拽的鼠标坐标得到一个鼠标坐标偏移量,加上原始面板坐标得到一个新的拖拽位置的坐标,进行坐标赋值即可。

👉四、核心代码

using UnityEngine;
using UnityEngine.EventSystems;

namespace Utility
{
    /// <summary>
    /// UGUI面板的拖拽移动功能
    /// </summary>
    [RequireComponent(typeof(RectTransform))]
    public class DragPanel : MonoBehaviour, IBeginDragHandler, IDragHandler
    {
        /// <summary>
        /// 静态方法,提供动态绑定拖拽面板的接口
        /// </summary>
        /// <param name="rectTransform"></param>
        /// <returns></returns>
        public static DragPanel Get(RectTransform rectTransform)
        {
            DragPanel dragPanel = rectTransform.gameObject.GetComponent<DragPanel>();
            if (dragPanel == null)
            {
                dragPanel = rectTransform.gameObject.AddComponent<DragPanel>();
            }
            return dragPanel;
        }

        /// <summary>
        /// 当前拖拽面板的根节点,一般是Canvas
        /// </summary>
        private RectTransform canvasRect;
        private Canvas rootCanvas;
        private Camera uiCam;
        /// <summary>
        /// 是否允许拖拽
        /// </summary>
        private bool isAllowDrag;

        private Vector3 mMouseDownPosition;
        private Vector3 mPanelOriginPosition;

        private void Awake()
        {
            Transform root = transform.root;
            if (root != null)
            {
                rootCanvas = root.GetComponent<Canvas>();
                canvasRect = root as RectTransform;
                if (rootCanvas.renderMode == RenderMode.ScreenSpaceCamera)
                {
                    uiCam = rootCanvas.worldCamera;
                }
            }
            isAllowDrag = rootCanvas != null;
        }

        public void OnBeginDrag(PointerEventData eventData)
        {
            if (!isAllowDrag) return;
            RectTransformUtility.ScreenPointToWorldPointInRectangle(
                canvasRect,
                Input.mousePosition,
                uiCam,
                out mMouseDownPosition);
            mPanelOriginPosition = transform.position;
        }

        public void OnDrag(PointerEventData eventData)
        {
            if (!isAllowDrag) return;
            Vector3 currentMousePosInUGUI;
            RectTransformUtility.ScreenPointToWorldPointInRectangle(
                canvasRect,
                Input.mousePosition,
                uiCam,
                out currentMousePosInUGUI);
            transform.position = mPanelOriginPosition + (currentMousePosInUGUI - mMouseDownPosition);
        }
    }
}

食用方法:

  1. 直接将DragPanel脚本拖拽赋值给需要拖拽的UI面板。
    在这里插入图片描述

  2. 如果需要拖拽功能的UI面板多,可使用动态绑定方法,该脚本提供了一个Get方法,参数为需要拖拽的对象的RectTransform组件。
    代码动态绑定方法如下:

			RectTransform rectTransform = xxx;//需要赋值,对象不能为空哦。
            DragPanel.Get(rectTransform);

👉五,总结

后续可以进行优化的地方:

  • 鼠标拖拽移动可以是用平滑移动方法
  • 对拖拽范围进行限制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1882104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web工程化

1、webpack 1.1 概念 一个前端打包器。 webpack 只识别javascript. 所以需要安装nodejs环境。 1.2 运行环境 Nodejs Nodejs 是运行JavaScript的环境。 因为nodejs发布了许多版本&#xff0c;在不同的技术栈下&#xff0c;需要使用不同的nodejs。 所以需要在电脑上安装n…

鸿蒙应用更新跳转到应用市场

鸿蒙没有应用下载安装&#xff0c;只支持跳转到应用市场更新 gotoMarket(){try {const request: Want {parameters: {// 此处填入要加载的应用包名&#xff0c;例如&#xff1a; bundleName: "com.huawei.hmsapp.appgallery"bundleName: com.huawei.hmos.maps.app}}…

SSM“点点通”餐饮点餐小程序-计算机毕业设计源码11264

摘要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;微信的餐饮点餐小程序更是深得消费者的喜爱&#xff0c;它的出现极大地改善了消费者的生活质量&#xff0c;同时&#xf…

大数据开发中如何计算用户留存及SQL示例

在大数据开发领域&#xff0c;用户留存是一个关键指标&#xff0c;它反映了产品吸引并保留用户的能力。 留存率的计算不仅有助于评估产品的健康状况&#xff0c;还能为产品优化和市场策略提供重要依据。 本文将详细介绍如何在大数据开发中计算用户留存&#xff0c;并附带具体…

docker k8s

1、docker是什么&#xff1f; 将环境和程序一起打包给到 服务器运行的工具软件。 2、基础镜像base image是什么&#xff1f; 操作系统&#xff1a;用户空间、内核空间 阉割操作系统&#xff0c;利用其的用户空间&#xff08;因为应用程序运行在用户空间&#xff09;&#xf…

永磁同步电机离线参数识别

引言 永磁同步电机&#xff08;PMSM&#xff09;因其结构简单、功率密度高、转矩惯量比大和效率高等优点&#xff0c;在工业生产、航空航天和新能源交通等领域得到了广泛应用。然而&#xff0c;传统的参数辨识方法依赖位置传感器&#xff0c;这不仅增加了硬件成本&#xff0c;…

薄冰英语语法学习--名词3-性别

上面的是人。 下面的是动物。 花个2分钟看一下人的&#xff0c;在花2分钟看一下动物的。记不住没关系&#xff0c;读一遍。像 我这样 男人 man &#xff0c;女人 woman 。xxx xxx ,xxx ,xxx 读完发现很多带ness代表雌性的。 核心 英语中的雌雄可以用&#xff0c;man 和 wo…

C++ :lambda表达式

目录 lambda表达式书写格式&#xff1a; lambda表达式各部分说明&#xff1a; lambda的使用示范&#xff1a; 注意事项&#xff1a; 返回值类型可以省略&#xff0c;参数也可也省略&#xff1a; sort内部也可以直接写lambda表达式&#xff1a; 排序时利用lambda进行排序…

【正点原子K210连载】第十六章 machine模块实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DNK210开发板 2&#xff09;平台购买地址https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第十六章 machine模块…

小区服务前台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;住户管理&#xff0c;管理员管理&#xff0c;员工管理&#xff0c;安保管理&#xff0c;安保分配管理&#xff0c;客服聊天管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;…

AI绘画Stable Diffusion 高清放大,多种方法详解,建议收藏!

&#x1f463; 本章概述 在Stable Diffusion我们想要得到一张高分辨率且具有细节特征的图片时&#xff0c;我们就需要使用一些图片放大算法来帮助我们实现。 本文主要概述在sd中常常使用的高清修复方法以及不同方法的区别和应用场景。同时也给出一些推荐的工作流&#xff0c;你…

python实现符文加、解密

在历史悠久的加密技术中&#xff0c;恺撒密码以其简单却有效的原理闻名。通过固定的字母位移&#xff0c;明文可以被转换成密文&#xff0c;而解密则是逆向操作。这种技术不仅适用于英文字母&#xff0c;还可以扩展到其他语言的字符体系&#xff0c;如日语的平假名或汉语的拼音…

jvm性能监控常用工具

在java的/bin目录下有许多java自带的工具。 我们常用的有 基础工具 jar:创建和管理jar文件 java&#xff1a;java运行工具&#xff0c;用于运行class文件或jar文件 javac&#xff1a;java的编译器 javadoc&#xff1a;java的API文档生成工具 性能监控和故障处理 jps jstat…

Pickle, SafeTensor, GGML和GGUF

如今&#xff0c;大型语言模型的使用方式有以下几种&#xff1a; 作为 OpenAI、Anthropic 或主要云提供商托管的专有模型的 API 端点作为从 HuggingFace 的模型中心下载的模型工件和/或使用 HuggingFace 库进行训练/微调并托管在本地存储中作为针对本地推理优化的格式的模型工…

springboot学习,如何用redission实现分布式锁

目录 一、springboot框架介绍二、redission是什么三、什么是分布式锁四、如何用redission实现分布式锁 一、springboot框架介绍 Spring Boot是一个开源的Java框架&#xff0c;由Pivotal团队&#xff08;现为VMware的一部分&#xff09;于2013年推出。它旨在简化Spring应用程序…

Verilog中的wire和reg有什么区别

大多数初学者还没有真正很难掌握Verilog/SystemVerilog硬件描述语言&#xff08;HDL&#xff09;中wire&#xff08;网络&#xff09;和reg&#xff08;变量&#xff09;的区别。这个概念是每个经验丰富的RTL设计都应该熟悉的。但是现在有许多没有Verilog开发经验的验证工程师都…

mybatis延迟加载

mybatis延迟加载 1、延迟加载概述 应用场景 ​ 如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求&#xff0c;当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。 延迟加载的好处 ​ 先从单表查询、需要时再从关联表去关联查…

最短路模型——AcWing 188. 武士风度的牛

最短路模型 定义 最短路模型是图论中的一个经典问题&#xff0c;旨在寻找从图中一个顶点到另一个顶点的路径&#xff0c;使得这条路径上的边&#xff08;或边的权重&#xff09;之和最小。这一模型在许多实际问题中有着广泛的应用&#xff0c;比如网络路由、地图导航、物流配…

音频转文字怎么转?4个音频转文字的方法一定要知道

随着夏日脚步的到来&#xff0c;各类活动和准备工作也随之增多。 在这样一个忙碌的时期&#xff0c;整理会议的音频记录变得尤为关键。然而&#xff0c;单单依靠手动整理&#xff0c;不仅耗时耗力&#xff0c;还可能出现错漏。 但也不用太着急&#xff0c;下面将为大家介绍几…

生产者发送数据,kafka服务器接收数据异常的问题记录

现象&#xff1a; 某个客户要求审计日志用kafka的方式传输给他们&#xff0c;使用了第三方的librdkafka库来开发。 往客户提供的kafka服务器上的一个topic发送数据&#xff0c;这个topic有三个分区&#xff0c;客户反馈接收到的数据和发送端发送的实际数量对不上&#xff0c;他…