最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實現(xiàn)對UI元素拖拽的實現(xiàn)示例

 更新時間:2025年12月12日 09:34:45   作者:yi碗湯園  
本文介紹了在Unity中使用C#實現(xiàn)UI元素拖拽功能的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

本篇文章來分享一下對UI元素的拖拽實現(xiàn)。

實現(xiàn)思路

1)按下記錄偏移

鼠標按下時,記錄“UI元素錨點” 與“鼠標點擊點”的位置差(offset)

2)拖動更新位置

鼠標移動時,用“鼠標實時位置+偏移量” 更新UI位置,保證UI元素始終跟隨鼠標的“抓取點”移動。

為什么要使用offset?

使用offset是為了讓拖拽操作更自然(避免鼠標點擊物體時,物體瞬間跳到鼠標位置)。

若不使用offset,直接把物體位置設為鼠標位置(rectTransform.position = mousePos):當點擊物體非中心點(比如左上角)時,物體會瞬間 “瞬移” 到鼠標指針正下方,拖拽手感非常生硬。因為鼠標點擊的位置(mousePos)和物體錨點位置(rectTransform.position)通常不在同一位置,直接賦值會導致物體跳位。

計算邏輯

rectTransform.position:物體的錨點位置(默認是物體中心點);

mousePos:鼠標點擊時,在世界空間中的指針位置;

offset:兩者的差值 = 物體錨點位置 - 鼠標點擊位置。

假設物體錨點在屏幕上的位置是 (100, 200)(rectTransform.position);點擊的是物體左上角,此時鼠標位置是 (80, 220)(mousePos);則offset = (100,200) - (80,220) = (20, -20)。此時offset代表:“鼠標點擊點”相對于“物體錨點”的偏移量(即錨點在鼠標點擊點的右側(cè)20、下方20位置)。

注意offset只需在OnPointerDown(鼠標按下時)計算一次,之后拖拽過程中保持不變。因為它只需要記錄按下瞬間的偏移關(guān)系,拖動時復用即可。如果在OnDrag中重復計算,反而會導致物體抖動。

簡而言之,offset就是記住抓住物體的位置,讓拖拽時物體跟著抓點走,而不是跳來跳去。

代碼實現(xiàn)

using UnityEngine;
using UnityEngine.EventSystems;

public class Drag : MonoBehaviour, IDragHandler, IPointerDownHandler
{
    private RectTransform rectTransform;
    private Vector3 offset;

    private void Awake()
    {
        rectTransform = gameObject.GetComponent<RectTransform>();
    }
    public void OnDrag(PointerEventData eventData)
    {
        if (eventData.pointerPressRaycast.gameObject == gameObject)
        {
            if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out Vector3 mousePos))
            {
                rectTransform.position = mousePos + offset;
            }
        }
    }
    public void OnPointerDown(PointerEventData eventData)
    {
        RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out Vector3 mousePos);
        offset = rectTransform.position - mousePos;
    }
}

效果

Unity常用UI交互接口

接口名稱

核心方法

觸發(fā)時機

使用場景

IPointerDownHandler

OnPointerDown(PointerEventData eventData)

鼠標/觸摸按下到UI元素時(觸發(fā)一次)

拖拽起始記錄、長按檢測起點、按鈕按下反饋

IPointerUpHandler

OnPointerUp(PointerEventData eventData)

鼠標/觸摸在UI元素上抬起時(移出元素后抬起不觸發(fā))

拖拽結(jié)束判定、按鈕抬起反饋

IPointerClickHandler

OnPointerClick(PointerEventData eventData)

按下 + 抬起都在同一UI元素上(完整點擊,觸發(fā)一次)

普通按鈕點擊、UI元素選中

IPointerEnterHandler

OnPointerEnter(PointerEventData eventData)

鼠標/觸摸移入UI元素時(觸發(fā)一次)

懸停提示顯示、按鈕高亮

IPointerExitHandler

OnPointerExit(PointerEventData eventData)

鼠標/觸摸移出UI元素時(觸發(fā)一次)

懸停提示關(guān)閉、按鈕高亮取消

IDragHandler

OnDrag(PointerEventData eventData)

拖拽過程中每幀觸發(fā)(需先按下UI元素)

UI拖拽移動、滑動條拖動、背包物品拖拽

IBeginDragHandler

OnBeginDrag(PointerEventData eventData)

拖拽開始時(按下后首次移動,觸發(fā)一次)

記錄拖拽初始位置、生成拖拽虛影

IEndDragHandler

OnEndDrag(PointerEventData eventData)

拖拽結(jié)束時(抬起鼠標/觸摸,觸發(fā)一次)

判定拖拽落點、恢復原UI狀態(tài)

IScrollHandler

OnScroll(PointerEventData eventData)

鼠標滾輪滾動或觸摸滑動時(每幀觸發(fā))

自定義滾動視圖UI縮放、滾動文本框

ISelectHandler

OnSelect(BaseEventData eventData)

UI元素被選中時(如鍵Tab切換)

輸入框選中高亮、菜單選項選中反饋

IDeselectHandler

OnDeselect(BaseEventData eventData)

UI元素失去選中時(如切換到其他元素)

輸入框失去焦點保存內(nèi)容、取消菜單選中狀態(tài)

ISubmitHandler

OnSubmit(BaseEventData eventData)

選中UI元素后提交(如按 Enter 鍵)

菜單確認、表單提交、按鈕激活

ICancelHandler

OnCancel(BaseEventData eventData)

觸發(fā)取消操作時(如按Esc鍵)

關(guān)閉彈窗、取消輸入、退出當前界面

到此這篇關(guān)于C#實現(xiàn)對UI元素拖拽的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# UI元素拖拽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#驗證給定字符串形式日期是否合法的方法

    C#驗證給定字符串形式日期是否合法的方法

    這篇文章主要介紹了C#驗證給定字符串形式日期是否合法的方法,實例分析了C#針對字符串及日期的操作技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • C#中實現(xiàn)深度優(yōu)先搜索

    C#中實現(xiàn)深度優(yōu)先搜索

    深度優(yōu)先搜索(DFS)是一種遍歷或搜索圖或樹的算法,廣泛應用于迷宮尋路、圖像處理、路徑規(guī)劃、模式識別、社交網(wǎng)絡分析等領域,學習DFS有助于理解圖結(jié)構(gòu),解決回溯問題,提升算法設計與分析能力,下面就來介紹一下
    2024-10-10
  • C# 判斷語句詳解與應用示例小結(jié)

    C# 判斷語句詳解與應用示例小結(jié)

    C#作為一種強大的編程語言,提供了豐富的判斷語句,能夠幫助我們實現(xiàn)復雜的程序邏輯,本文將詳細解析 C# 的判斷語句,包括它們的語法、使用方法以及在實際編程中的應用,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • 最新評論

    全州县| 越西县| 连江县| 孝义市| 澄迈县| 东丽区| 大名县| 洛扎县| 九寨沟县| 南阳市| 工布江达县| 维西| 乐山市| 济源市| 错那县| 勃利县| 虞城县| 尖扎县| 辽源市| 金溪县| 三亚市| 平武县| 工布江达县| 奉节县| 南涧| 道孚县| 黑水县| 鹿泉市| 台中市| 屏东市| 台北市| 南乐县| 井冈山市| 望谟县| 项城市| 五莲县| 清新县| 海伦市| 铜陵市| 延川县| 台江县|