網站首頁 編程語言 正文
UGUI 可視化創建以及關聯事件很方便, 動態創建可以利用創建好的 Prefab 進行實例化, 只是在關聯事件上有些復雜, 本文總結了幾種給按鈕綁定事件的關聯方式.
1. 可視化創建及事件綁定
Step 1 : 通過 Hierarchy 面板創建 UI > Button
.
Step 2 : 創建一個腳本 TestClick.cs, 定義了一個 Click 的 public 方法.
Step 3 : 選中 Hierarchy 中的 Button, Add Component
腳本 TestClick.cs
Step 4 : 在 Button(Script)
關聯 TestClick 腳本里的 Click 方法.
Step 5 : Done.
TestClick.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestClick : MonoBehaviour { public void Click(){ Debug.Log ("Button Clicked. TestClick."); } }
2. 通過直接綁定腳本來綁定事件
Step 1 : 通過 Hierarchy 面板創建 UI > Button
.
Step 2 : 創建一個 ClickHandler.cs 腳本, 定義了一個私有方法 OnClick(), 并在 Start() 方法里為 Button 添加點擊事件的監聽,作為參數傳入 OnClick 方法.
Step 3 : 將 ClickHandler 綁定在 Button 對象上.
Step 4 : Done.
ClickHandler.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ClickHandler : MonoBehaviour { void Start () { Button btn = this.GetComponent<Button> (); btn.onClick.AddListener (OnClick); } private void OnClick(){ Debug.Log ("Button Clicked. ClickHandler."); }
3. 通過 EventTrigger 實現按鈕點擊事件
UGUI 系統中 Button 默認只提供了 OnClick 的調用方法, 有時候我們還需要監聽鼠標進入事件 (MouseIn) 和鼠標滑出事件 (MouseOut). 就需要借助 UI 系統中的 EventTrigger 腳本來實現.
Step 1 : 通過 Hierarchy 面板創建 UI > Button
.
Step 2 : 創建一個 EventTriggerHandler.cs 腳本, 利用 UnityEngine.EventSystems.EventTrigger 添加監聽事件.
Step 3 : 綁定 EventTriggerHandler.cs 腳本到 Button 上.
Step 4 : Done.
EventTriggerHandler.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; // 需要 EventTrigger 腳本的支援 [RequireComponent(typeof(UnityEngine.EventSystems.EventTrigger))] public class EventTriggerHandler : MonoBehaviour { // Use this for initialization void Start () { Button btn = this.GetComponent<Button> (); EventTrigger trigger = btn.gameObject.GetComponent<EventTrigger> (); EventTrigger.Entry entry = new EventTrigger.Entry (); // 鼠標點擊事件 entry.eventID = EventTriggerType.PointerClick; // 鼠標進入事件 entry.eventID = EventTriggerType.PointerEnter; // 鼠標滑出事件 entry.eventID = EventTriggerType.PointerExit; entry.callback = new EventTrigger.TriggerEvent (); entry.callback.AddListener (OnClick); // entry.callback.AddListener (OnMouseEnter); trigger.triggers.Add (entry); } private void OnClick(BaseEventData pointData){ Debug.Log ("Button Clicked. EventTrigger.."); private void OnMouseEnter(BaseEventData pointData){ Debug.Log ("Button Enter. EventTrigger.."); }
4. 通過 MonoBehaviour 實現事件類接口來實現事件的監聽
Step 1 : 通過 Hierarchy 面板創建 UI > Button
.
Step 2 : 創建一個 EventHandler.cs 腳本.
Step 3 : 將腳本綁定在 Button 對象上.
Step 4 : Done.
EventHandler.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class EventHandler : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IDragHandler { public void OnPointerClick(PointerEventData eventData){ if(eventData.pointerId == -1){ Debug.Log ("Left Mouse Clicked."); } else if(eventData.pointerId == -2){ Debug.Log ("Right Mouse Clicked."); } } public void OnPointerEnter(PointerEventData eventData){ Debug.Log ("Pointer Enter.."); public void OnPointerExit(PointerEventData eventData){ Debug.Log ("Pointer Exit.."); public void OnPointerDown(PointerEventData eventData){ Debug.Log ("Pointer Down.."); public void OnDrag(PointerEventData eventData){ Debug.Log ("Dragged.."); }
UGUI 如何判斷 UI 元素被點擊時是鼠標的哪個按鍵, 上面的代碼中我們可以根據 eventData.pointerId 來監聽是鼠標左鍵還是右鍵. 但是每個 UI 元素都創建一個 MonoBehaviour 來監聽各個事件顯然不好, 下面是通過利用 Delegate 和 Event 來做一個通用類 UIEventListener 來處理事件 (觀察者模式).
UIEventListener.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class UIEventListener : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler { // 定義事件代理 public delegate void UIEventProxy(GameObject gb); // 鼠標點擊事件 public event UIEventProxy OnClick; // 鼠標進入事件 public event UIEventProxy OnMouseEnter; // 鼠標滑出事件 public event UIEventProxy OnMouseExit; public void OnPointerClick(PointerEventData eventData){ if (OnClick != null) OnClick (this.gameObject); } public void OnPointerEnter(PointerEventData eventData){ if (OnMouseEnter != null) OnMouseEnter (this.gameObject); public void OnPointerExit(PointerEventData eventData){ if (OnMouseExit != null) OnMouseExit (this.gameObject); }
TestEvent.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TestEvent : MonoBehaviour { void Start () { Button btn = this.GetComponent<Button> (); UIEventListener btnListener = btn.gameObject.AddComponent<UIEventListener> (); btnListener.OnClick += delegate(GameObject gb) { Debug.Log(gb.name + " OnClick"); }; btnListener.OnMouseEnter += delegate(GameObject gb) { Debug.Log(gb.name + " OnMouseEnter"); btnListener.OnMouseExit += delegate(GameObject gb) { Debug.Log(gb.name + " OnMOuseExit"); } }
TestEvent 腳本綁定在 Button 上即可.
Project 結構
代碼 : Here
原文鏈接:https://www.cnblogs.com/isayes/p/6370168.html#5008315
相關推薦
- 2022-12-01 使用SDLocalize實現高效完成iOS多語言工作_IOS
- 2022-03-12 用C語言實現圣誕樹(簡易版+進階版)_C 語言
- 2022-07-13 k8s 之 kubectl 提示 “The connection to the server loc
- 2022-04-16 python如何導入自己的模塊_python
- 2022-10-26 一文解析?Golang?sync.Once?用法及原理_Golang
- 2022-04-23 .NET?Core使用APB?vNext框架入門教程_實用技巧
- 2023-02-15 Go?Comparable?Type原理深入解析_Golang
- 2022-05-13 Python Anaconda安裝sasl,thrift,thrift-sasl 并連接PyHive
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支