【unity游戲開發入門到精通——UGUI】UI事件監聽接口

注意:考慮到UGUI的內容比較多,我將UGUI的內容分開,并全部整合放在【unity游戲開發——UGUI】專欄里,感興趣的小伙伴可以前往逐一查看學習。

文章目錄

  • 前言
    • 1、什么是UGUI事件接口?
    • 2、想要監聽事件步驟
  • 一、事件接口
    • 1、UGUI常用事件接口
    • 2、UGUI不常用事件接口
    • 3、導航相關接口
    • 4、實例
  • 二、PointerEventData關鍵參數
    • 1、關鍵參數
    • 2、實例
  • 專欄推薦
  • 完結

前言

1、什么是UGUI事件接口?

UGUI 事件接口為 UI 交互提供了靈活的事件處理機制,通過實現這些接口可以讓任意 UI 控件響應復雜交互(如長按、拖拽等),突破基礎事件監聽限制。

2、想要監聽事件步驟

  • 就在腳本中繼承對應接口
  • 實現對應接口的方法
  • 把腳本掛載到對應控件上
  • 當對控件進行對應的操作時,會自動進行對應方法的邏輯。

一、事件接口

1、UGUI常用事件接口

接口名稱實現方法觸發條件適用場景
IPointerEnterHandlerOnPointerEnter鼠標進入控件區域懸停提示、高亮反饋
IPointerExitHandlerOnPointerExit鼠標離開控件區域取消高亮狀態
IPointerDownHandlerOnPointerDown按下瞬間點擊音效觸發
IPointerUpHandlerOnPointerUp抬起瞬間結束按壓狀態
IPointerClickHandlerOnPointerClick完整點擊操作(按下+抬起)按鈕常規點擊
IBeginDragHandlerOnBeginDrag開始拖拽時拖拽物體初始化
IDragHandlerOnDrag持續拖拽時實時更新物體位置
IEndDragHandlerOnEndDrag拖拽結束時放置物體邏輯

不同平臺注意

  • 移動端無鼠標概念,OnPointerEnter/Exit 失效

  • 觸控設備通過 pointerId 區分多點觸控

2、UGUI不常用事件接口

接口名稱實現方法觸發條件
IInitializePotentialDragHandlerOnInitializePotentialDrag在找到拖動目標時調用,可用于初始化值。
IDropHandlerOnDrop在拖動目標對象上調用。
IScrollHandlerOnScroll當鼠標滾輪滾動時調用。
IUpdateSelectedHandlerOnUpdateSelected每次勾選時在選定對象上調用。
ISelectHandlerOnSelect當對象成為選定對象時調用。
IDeselectHandlerOnDeselect取消選擇選定對象時調用。

3、導航相關接口

接口名稱實現方法觸發條件
IMoveHandlerOnMove發生移動事件(上、下、左、右等)時調用。
ISubmitHandlerOnSubmit按下 Submit 按鈕時調用。
ICancelHandlerOnCancel按下 Cancel 按鈕時調用。

4、實例

引用EventSystems命名空間,繼承MonoBehavior的腳本繼承對應的事件接口,并實現接口中的內容。

using UnityEngine;
using UnityEngine.EventSystems;public class MyEventHandler : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, 
IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, 
IBeginDragHandler, IDragHandler, IEndDragHandler
{//當即將開始拖拽時在拖拽對象上調用。public void OnBeginDrag(PointerEventData eventData){print("即將開始拖拽");}//當發生拖拽時調用。public void OnDrag(PointerEventData eventData){print("發生拖拽");print(eventData.delta); //打印eventData中的delta屬性,表示拖動事件的位移量}//當拖拽完成時在拖拽對象上調用。public void OnEndDrag(PointerEventData eventData){print("拖拽完成");}//當在同一對象上,完成點擊(按下再松開鼠標)時調用。public void OnPointerClick(PointerEventData eventData){print("完成點擊");}//當在對象上鼠標或者觸碰按下時調用。public void OnPointerDown(PointerEventData eventData){print("鼠標(觸碰)按下"); //打印一條字符串,表示鼠標或觸碰按下print(eventData.pointerId); //打印eventData中的pointerId屬性,表示按下事件的指針標識符,用于區分多點觸控print(eventData.position); //打印eventData中的position屬性,表示按下事件的屏幕坐標}//當鼠標指針進入對象時調用。public void OnPointerEnter(PointerEventData eventData){//鼠標進入 在移動設備上 是不存在 因為不存在 進入的概念print("鼠標進入");}//當鼠標指針退出對象時調用。public void OnPointerExit(PointerEventData eventData){//鼠標離開 在移動設備上 是不存在 因為不存在 進入的概念print("鼠標離開");}//當在對象上鼠標或觸摸抬起時調用。public void OnPointerUp(PointerEventData eventData){print("鼠標(觸碰)抬起");}
}

將該腳本掛載到想要監聽自定義事件的UI控件上
在這里插入圖片描述

結果
在這里插入圖片描述

二、PointerEventData關鍵參數

PointerEventData 類是 Unity UGUI 事件系統中用于存儲與用戶輸入設備(如鼠標、觸摸屏等)交互相關信息的重要參數。它作為 UGUI 事件接口函數的通用數據載體,包含了豐富的指針交互狀態屬性。

PointerEventData 繼承自 BaseEventData 類,后者提供了一個通用的事件數據結構基礎。
在這里插入圖片描述

1、關鍵參數

屬性說明類型作用
pointerId輸入源標識Int用來區分不同輸入源(如多個觸摸點、不同鼠標設備等)。處理多指觸控時,每個觸摸點分配唯一的 pointerId。
position當前屏幕坐標Vector2描述當前指針在屏幕坐標系中的實時位置,當用戶進行拖拽操作時,這個值會持續更新。
pressPosition按下位置Vector2記錄了指針按下那一刻在屏幕上的初始位置。
delta幀間位移量Vector2表示上一幀到當前幀的位移變化量,指針在屏幕上的位移變化量。
pointerPress當前按壓對象GameObject獲取當前按下的對象。
pressPosition按下位置Vector2記錄了指針按下那一刻在屏幕上的初始位置。
clickCount連續點擊次數Int表示連續點擊的次數,用于區分單擊和快速連續點擊(連擊)的行為。
clickTime最后一次點擊發生的時間戳float記錄了最后一次點擊發生的時間戳,有助于根據點擊間隔執行不同的響應邏輯。
button區分鼠標左右中鍵操作PointerEventData.InputButtonLeft:左鍵,Right:右鍵,Middle:中鍵
dragging拖拽狀態bool指示當前是否處于拖拽過程中。需結合 IDragHandler 接口使用。
scrollDelta滾輪增量Vector2鼠標滾輪的滾動量需結合 IScrollHandler 接口使用。

2、實例

using UnityEngine;
using UnityEngine.EventSystems;public class MyEventHandler : MonoBehaviour,IPointerClickHandler,IDragHandler,IScrollHandler 
{//持續拖拽時public void OnDrag(PointerEventData eventData){Debug.Log("當前屏幕坐標" + eventData.position );Debug.Log("幀間位移量 " + eventData.delta );Debug.Log("拖拽狀態 " + eventData.dragging );}//當在同一對象上,完成點擊(按下+抬起)時調用。public void OnPointerClick(PointerEventData eventData){Debug.Log("輸入源標識" + eventData.pointerId);Debug.Log("按下位置" + eventData.pressPosition  );Debug.Log("按鍵類型 " + eventData.button);Debug.Log("當前按壓對象" + eventData.pointerPress.name );Debug.Log("連續點擊次數" + eventData.clickCount);Debug.Log("最后一次點擊發生的時間戳" + eventData.clickTime);}//當鼠標滾輪滾動時調用public void OnScroll(PointerEventData eventData){Debug.Log("滾輪增量" + eventData.scrollDelta);}
}

結果
在這里插入圖片描述


專欄推薦

地址
【unity游戲開發入門到精通——C#篇】
【unity游戲開發入門到精通——unity通用篇】
【unity游戲開發入門到精通——unity3D篇】
【unity游戲開發入門到精通——unity2D篇】
【unity實戰】
【制作100個Unity游戲】
【推薦100個unity插件】
【實現100個unity特效】
【unity框架/工具集開發】
【unity游戲開發——模型篇】
【unity游戲開發——InputSystem】
【unity游戲開發——Animator動畫】
【unity游戲開發——UGUI】
【unity游戲開發——聯網篇】
【unity游戲開發——優化篇】
【unity游戲開發——shader篇】

完結

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果學習過程中遇到任何問題,也歡迎你評論私信找我。

贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注,你的每一次支持都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤或者有更好的解決方法,也歡迎評論私信告訴我哦!
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78598.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78598.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78598.shtml

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

相關文章

Spark知識總結

寬窄依賴:父RDD的分區只對應下面子RDD的一個分區,為窄依賴。其余為寬依賴 維度??窄依賴??寬依賴?數據傳輸無shuffle,本地處理14需shuffle,跨節點傳輸14并行度高(允許流水線并行)57低(需等…

銘記之日(3)——4.28

銘記之日(3)——4.28 25.4.28,絕對是繼20.12.19與24.6.26之后,又一個被釘在恥辱柱上的日子。 4.28本質上為12.19的嚴重惡劣版。 道德敗壞、惡劣的大騙子終于在今日穿幫落馬。 斯文面孔下,竟藏匿了如此罪惡幽暗混沌的內心。 24.10.20&…

第16節:傳統分類模型-支持向量機(SVM)在圖像分類中的應用

一、引言 支持向量機(Support Vector Machine, SVM)作為一種經典的機器學習算法,自20世紀90年代由Vapnik等人提出以來,在模式識別和分類任務中表現出卓越的性能。 在深度學習興起之前,SVM長期占據著圖像分類領域的主導地位,即使…

《系統分析師-第三階段—總結(六)》

背景 采用三遍讀書法進行閱讀,此階段是第三遍。 過程 本篇總結第11章第12章的內容 第11章 第12章 總結 軟件架構設計是宏觀,基本架構確定之后,開始了系統化設計, 系統設計中對應的基本部分的知識較多,基礎知識是第…

new的使用

上次堆區的介紹中,我們提到了一個關鍵字new,那今天我們就詳細講講它 今天我們主要將兩個內容 1.new的基本語法 2.用new創建數組 1.new的基本語法 new,可以在堆區中創建空間,來存放數據,就比如像下面這樣 int* p new int(29);//n…

使用python實現自動化拉取壓縮包并處理流程

使用python實現自動化拉取壓縮包并處理流程 實現成果展示使用說明 實現成果展示 使用說明 執行./run.sh 腳本中的內容主要功能是: 1、從遠程服務器上下拉制定時間更新的數據 2、將數據中的zip拷貝到指定文件夾內 3、解壓后刪除所有除了lcm之外的文件 4、新建一個ou…

香橙派打包qt文件報錯“xcb 插件無法加載”與“QObject::moveToThread”線程錯誤的解決方案

PyQt 報錯總結:打包文件過程,“xcb 插件無法加載”與“QObject::moveToThread”線程錯誤的解決方案全解析 在使用 PyQt5 搭建圖形界面時,打包文件的過程中出現的問題,真難繃,搞了半天。 Qt 平臺插件 xcb 無法加載QOb…

Missashe考研日記-day29

Missashe考研日記-day29 1 專業課408 學習時間:3h學習內容: 今天先是把虛擬存儲剩余的課聽完了,然后就是做課后選擇題,57道,已經接受了OS課后題尤其多的事實了。解決并且理解完習題之后就開始預習文件管理的內容&…

【Linux】第十二章 安裝和更新軟件包

目錄 1. 什么是RPM? 2. dnf是什么,它和rpm有什么聯系和區別? 3. RHEL 中如何做才能啟用對第三方存儲庫的支持? 4. 怎么理解RHEL9中的應用流(Application Streams)和模塊(Modules)? 5. RHEL9 有兩個必要的軟件存儲…

新時代下的存儲過程開發實踐與優化

隨著現代應用系統的復雜度不斷增加,數據庫作為核心的數據存儲和處理引擎,其性能和可靠性顯得尤為重要。存儲過程(Stored Procedure)作為一種封裝在數據庫中的應用邏輯,使得開發者能夠在數據庫層面實現數據操作、數據校…

從梯度消失到百層網絡:ResNet 是如何改變深度學習成為經典的?

自AlexNet贏得2012年ImageNet競賽以來,每個新的獲勝架構通常都會增加更多層數以降低錯誤率。一段時間內,增加層數確實有效,但隨著網絡深度的增加,深度學習中一個常見的問題——梯度消失或梯度爆炸開始出現。 梯度消失問題會導致梯…

JVM——引入

什么是JVM?它與JDK、JRE的關系? JVM、JRE 和 JDK 是 Java 平臺的三個核心組件,各自承擔著不同的職責,它們之間的關系密不可分。理解它們的區別和聯系有助于更好地開發、部署和運行 Java 應用程序。對于 Java 開發者來說&#xff…

PyCharm 2023升級2024 版本

windows下把老版本卸載之后,需要把環境變量,注冊表信息刪除。 并且把C:\Users\用戶\AppData 文件夾下的 Local\JetBrains和Roaming\JetBrains 都刪除,再重新安裝 原舊項目升級的方式: 1.2023虛擬機的文件夾是venv 改為.venv…

從外賣大戰看O2O新趨勢:上門私廚平臺系統架構設計解析

京東高調進軍外賣市場,美團全力防守,兩大巨頭的競爭讓整個行業風起云涌。但在這場外賣大戰之外,一個更具潛力的細分市場正在悄然興起——上門私廚服務。 與標準化外賣不同,上門私廚提供的是個性化定制服務。廚師帶著新鮮食材上門現…

驅動開發系列53 - 一個OpenGL應用程序是如何調用到驅動廠商GL庫的

一:概述 一個 OpenGL 應用程序調用 GPU 驅動的過程,主要是通過動態鏈接庫(libGL.so)來完成的。本文從上到下梳理一下整個調用鏈,包含 GLVND、Mesa 或廠商驅動之間的關系。 二:調用關系 1. 首先一個 OpenGL 應用程序(比如游戲或圖形渲染軟件)在運行時會調用 OpenGL 提供…

springboot3 聲明式 HTTP 接口

1 介紹 在 Spring 6 和 Spring Boot 3 中,我們可以使用 Java 接口來定義聲明式的遠程 HTTP 服務。這種方法受到 Feign 等流行 HTTP 客戶端庫的啟發,與在 Spring Data 中定義 Repository 的方法類似。 聲明式 HTTP 接口包括用于 HTTP exchange 的注解方法…

多級緩存架構設計與實踐經驗

多級緩存架構設計與實踐經驗 在互聯網大廠Java求職者的面試中,經常會被問到關于多級緩存的架構設計和實踐經驗。本文通過一個故事場景來展示這些問題的實際解決方案。 第一輪提問 面試官:馬架構,歡迎來到我們公司的面試現場。請問您對多級…

Mac「brew」快速安裝Redis

安裝Redis 步驟 1:安裝 Redis 打開終端(Terminal)。 運行以下命令安裝 Redis: brew install redis步驟 2:啟動 Redis 安裝完成后,可以使用以下命令啟動 Redis 服務: brew services start redis…

文獻閱讀(一)植物應對干旱的生理學反應 | The physiology of plant responses to drought

分享一篇Science上的綜述文章,主要探討了植物應對干旱的生理機制,強調通過調控激素信號提升植物耐旱性、保障糧食安全的重要性。 摘要 干旱每年致使農作物產量的損失,比所有病原體造成損失的總和還要多。為適應土壤中的濕度梯度變化&#x…

if consteval

if consteval 是 C23 引入的新特性,該特性是關于immediate function 的,即consteval function。用于在編譯時檢查當前是否處于 立即函數上下文(即常量求值環境),并根據結果選擇執行不同的代碼路徑。它是對 std::is_con…