Unity開箱即用的UGUI面板的拖拽移動功能

文章目錄

      • 👉一、背景
      • 👉二、效果圖
      • 👉三、原理
      • 👉四、核心代碼
      • 👉五,總結

👉一、背景

之前做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.pswp.cn/diannao/38528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38528.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

More Effective C++ 35個改善編程與設計的有效方法筆記與心得 3

三. 異常 條款9&#xff1a; 利用destructors避免泄露資源 ????  在編程中&#xff0c;"資源"可以指任何系統級的有限資源&#xff0c;如內存、文件句柄、網絡套接字等。"泄露"則是指在應用程序中分配了資源&#xff0c;但在不再需要這些資源時沒有…

Linux 安裝 Redis 教程

優質博文&#xff1a;IT-BLOG-CN 一、準備工作 配置gcc&#xff1a;安裝Redis前需要配置gcc&#xff1a; yum install gcc如果配置gcc出現依賴包問題&#xff0c;在安裝時提示需要的依賴包版本和本地版本不一致&#xff0c;本地版本過高&#xff0c;出現如下問題&#xff1a…

Jupyter無法導入庫,但能在終端導入的問題

Jupyter無法導入庫&#xff0c;但能在終端導入 ?錯誤問題描述&#xff1a;conda activate LLMs激活某個Conda的環境后&#xff0c;盡管已經通過conda或者pip在這個環境中安裝了一些&#x1f40d;Python的庫&#xff0c;但無法在Jupyter中導入&#xff0c;卻能在終端成功導入。…

京東商品詳情數據接口(JD.item_get)丨京東API實時接口指南

京東商品詳情API接口&#xff08;JD.item_get&#xff09;是京東開放平臺提供的一個數據接口&#xff0c;用于獲取京東平臺上單個商品的詳細信息。 通過這個接口&#xff0c;開發者可以獲取到包括商品名稱、品牌、產地、規格參數、價格信息、銷量、評價、圖片、描述等在內的詳…

Node.js開發實戰 視頻教程 下載

ode.js開發實戰 視頻教程 下載 下載地址 https://download.csdn.net/download/m0_67912929/89487510 01-課程介紹.mp4 02-內容綜述.mp4 03-Node.js是什么? .mp4 04-Node.js可以用來做什么?.mp4 05-課程實戰項目介紹.mp4 06-什么是技術預研? .mp4 07-Node.js開發環境…

Windows 11 安裝 安卓子系統 (WSA)

How to Install Windows Subsystem for Android (WSA) on Windows 11 新手教程&#xff1a;如何安裝Windows 11 安卓子系統 說明 Windows Subsystem for Android 或 WSA 是由 Hyper-V 提供支持的虛擬機&#xff0c;可在 Windows 11 操作系統上運行 Android 應用程序。雖然它需…

【JS】注意考點

1.聲明變量時所遵循的規則&#xff1a; (1)可以使用一個保留關鍵字var同時聲明多個變量 (2)可以在聲明變量的同時對其賦值&#xff0c; (3)如果只是聲明了變量&#xff0c;并未對其賦值&#xff0c;其值就默認為 Undefined。 (4)保留關鍵字var可以用作for語句和for…in語句…

python基礎_類

在Python中&#xff0c;類&#xff08;Class&#xff09;是面向對象編程&#xff08;OOP&#xff09;的核心概念之一。類提供了一種創建新對象的模板&#xff0c;這些對象通常被稱為類的實例或對象。以下是關于Python類的一些關鍵點和特性&#xff1a; 定義類 類通過class關鍵…

PostgreSQL的系統視圖pg_stat_wal

PostgreSQL的系統視圖pg_stat_wal 在 PostgreSQL 數據庫中&#xff0c;pg_stat_wal 視圖提供了與 WAL&#xff08;Write-Ahead Logging&#xff09;日志有關的統計信息。WAL 是 PostgreSQL 用于確保數據一致性和持久性的重要機制。因此&#xff0c;監控和分析 WAL 活動對于數據…

ctfshow-web入門-命令執行(web71-web74)

目錄 1、web71 2、web72 3、web73 4、web74 1、web71 像上一題那樣掃描但是輸出全是問號 查看提示&#xff1a;我們可以結合 exit() 函數執行php代碼讓后面的匹配緩沖區不執行直接退出。 payload&#xff1a; cvar_export(scandir(/));exit(); 同理讀取 flag.txt cinclud…

文華財經博易大師盤立方多空波段止損畫線指標公式

TT:PERIOD7; EMA120:EMA(C,120); RSV:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100; K:SMA(RSV,3,1); D:SMA(K,3,1); J:3*K-2*D; DRAWTEXT(TT&&J<0,L,多),VALIGN0; DRAWTEXT(TT&&J>100,H,空),VALIGN2; IF(TT,EMA(C,60),NULL),RGB(255,255,2…

JavaScript數組對象 , 正則對象 , String對象以及自定義對象介紹

1. Array數組對象 數組對象是使用單獨的變量名來存儲一系列的值。 1.1創建一個數組 創建一個數組&#xff0c;有三種方法。 【1】常規方式: let 數組名 new Array();【2】簡潔方式: 推薦使用 let 數組名 new Array(數值1,數值2,...);【3】字面:在js中創建數組使用中括號…

【ubuntu 】使用samba配置共享用戶home目錄和其他具體路徑

目錄 1 安裝samba 2 修改Samba配置文件 3 增加Rose用戶的samba帳號 4 重啟samba 5 測試 1 安裝samba 使用如下命令安裝samba&#xff1a; sudo apt-get updatesudo apt-get install samba openssh-server 2 修改Samba配置文件 sudo cp /etc/samba/smb.conf /etc/samba…

試用筆記之-收錢吧安卓版演示源代碼,收錢吧手機版感受

首先下載&#xff1a; https://download.csdn.net/download/tjsoft/89499105 安卓手機安裝 如果有收錢吧帳號輸入收錢吧帳號和密碼。 如果沒有收錢吧帳號點我的注冊 登錄收錢吧帳號后就可以把手機當成收錢吧POS機用了&#xff0c;還可以掃客服的付款碼哦 源代碼技術交流QQ:42…

Docker安裝MySQL5

Docker安裝MySQL5 前言 MySQL 是一個開源的關系型數據庫管理系統&#xff0c;廣泛用于各種 Web 應用程序的開發和生產環境中。MySQL 5 是 MySQL 數據庫的一個較早版本&#xff0c;雖然不再是最新版本&#xff0c;但仍然被一些項目所使用和支持。 在 Docker 中安裝 MySQL 5 可…

Docker 手冊

幫助命令 docker 命令 --help鏡像命令 docker images (-a所有 &#xff5c; -q只顯示容器的ID) docker search 鏡像名 docker pull 鏡像名&#xff1a;版本號 docker rmi -f ID&#xff5c;鏡像名&#xff1a;版本號 // 刪除本地一個或多個鏡像 docker rmi -f $(docker …

U盤數據恢復實戰指南:原因、方案與預防措施

一、引言&#xff1a;U盤數據恢復概述 在數字化時代&#xff0c;U盤作為一種便攜式存儲設備&#xff0c;廣泛應用于個人和企業中。然而&#xff0c;由于各種原因&#xff0c;U盤數據丟失的問題時有發生。U盤數據恢復技術便是在這種情況下應運而生&#xff0c;它幫助用戶在數據…

TPS61085非同步650kHz,1.2MHz, 18.5V升壓DCDC芯片

1 特點 TPS61085外觀和絲印PMKI 2.3 V 至 6 V 輸入電壓范圍 具有 2.0A 開關電流的 18.5V 升壓轉換器 650kHz/1.2MHz 可選開關頻率 可調軟啟動 熱關斷 欠壓閉鎖 8引腳VSSOP封裝 8引腳TSSOP封裝 2 應用 手持設備 GPS接收器 數碼相機 便攜式應用 DSL調制解調器 PCMCIA卡 TFT LCD…

MySQL之事務特性ACID、并發事務問題、隔離級別

1、事務特性ACID 原子性&#xff1a;事務是不可分割的最小操作單元&#xff0c;要么全部成功&#xff0c;要么全部失敗。一致性&#xff1a;事務完成時&#xff0c;必須使所有數據都保持一致狀態。隔離性&#xff1a;數據庫系統提供的隔離機制&#xff0c;保證事務在不外部并發…

Java并發編程基礎知識點

目錄 Java并發編程基礎知識點1、線程&#xff0c;進程概念及二者的關系進程相關概念線程相關概念進程與線程的關系補充小知識點&#xff1a; 2、線程的狀態Java線程的狀態&#xff1a;Java線程不同狀態之間的切換圖示 3、Java程序中如何創建線程&#xff1f;①、繼承Thread類②…