注意
:考慮到UGUI的內容比較多,我將UGUI的內容分開,并全部整合放在【unity游戲開發——UGUI】專欄里,感興趣的小伙伴可以前往逐一查看學習。
文章目錄
- 前言
- 1、什么是UGUI事件接口?
- 2、想要監聽事件步驟
- 一、事件接口
- 1、UGUI常用事件接口
- 2、UGUI不常用事件接口
- 3、導航相關接口
- 4、實例
- 二、PointerEventData關鍵參數
- 1、關鍵參數
- 2、實例
- 專欄推薦
- 完結
前言
1、什么是UGUI事件接口?
UGUI 事件接口為 UI 交互提供了靈活的事件處理機制,通過實現這些接口可以讓任意 UI 控件響應復雜交互(如長按、拖拽等),突破基礎事件監聽限制。
2、想要監聽事件步驟
- 就在腳本中繼承對應接口
- 實現對應接口的方法
- 把腳本掛載到對應控件上
- 當對控件進行對應的操作時,會自動進行對應方法的邏輯。
一、事件接口
1、UGUI常用事件接口
接口名稱 | 實現方法 | 觸發條件 | 適用場景 |
---|---|---|---|
IPointerEnterHandler | OnPointerEnter | 鼠標進入控件區域 | 懸停提示、高亮反饋 |
IPointerExitHandler | OnPointerExit | 鼠標離開控件區域 | 取消高亮狀態 |
IPointerDownHandler | OnPointerDown | 按下瞬間 | 點擊音效觸發 |
IPointerUpHandler | OnPointerUp | 抬起瞬間 | 結束按壓狀態 |
IPointerClickHandler | OnPointerClick | 完整點擊操作(按下+抬起) | 按鈕常規點擊 |
IBeginDragHandler | OnBeginDrag | 開始拖拽時 | 拖拽物體初始化 |
IDragHandler | OnDrag | 持續拖拽時 | 實時更新物體位置 |
IEndDragHandler | OnEndDrag | 拖拽結束時 | 放置物體邏輯 |
不同平臺注意
-
移動端無鼠標概念,
OnPointerEnter/Exit
失效 -
觸控設備通過
pointerId
區分多點觸控
2、UGUI不常用事件接口
接口名稱 | 實現方法 | 觸發條件 |
---|---|---|
IInitializePotentialDragHandler | OnInitializePotentialDrag | 在找到拖動目標時調用,可用于初始化值。 |
IDropHandler | OnDrop | 在拖動目標對象上調用。 |
IScrollHandler | OnScroll | 當鼠標滾輪滾動時調用。 |
IUpdateSelectedHandler | OnUpdateSelected | 每次勾選時在選定對象上調用。 |
ISelectHandler | OnSelect | 當對象成為選定對象時調用。 |
IDeselectHandler | OnDeselect | 取消選擇選定對象時調用。 |
3、導航相關接口
接口名稱 | 實現方法 | 觸發條件 |
---|---|---|
IMoveHandler | OnMove | 發生移動事件(上、下、左、右等)時調用。 |
ISubmitHandler | OnSubmit | 按下 Submit 按鈕時調用。 |
ICancelHandler | OnCancel | 按下 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.InputButton | Left :左鍵,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,如果學習過程中遇到任何問題,也歡迎你評論私信找我。
贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注
,你的每一次支持
都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤
或者有更好的解決方法
,也歡迎評論私信告訴我哦!