Unity?UGUI?按鈕綁定事件的?4?種方式匯總
UGUI 可視化創(chuàng)建以及關(guān)聯(lián)事件很方便, 動(dòng)態(tài)創(chuàng)建可以利用創(chuàng)建好的 Prefab 進(jìn)行實(shí)例化, 只是在關(guān)聯(lián)事件上有些復(fù)雜, 本文總結(jié)了幾種給按鈕綁定事件的關(guān)聯(lián)方式.
1. 可視化創(chuàng)建及事件綁定
Step 1 : 通過(guò) Hierarchy 面板創(chuàng)建 UI > Button
.
Step 2 : 創(chuàng)建一個(gè)腳本 TestClick.cs, 定義了一個(gè) Click 的 public 方法.
Step 3 : 選中 Hierarchy 中的 Button, Add Component
腳本 TestClick.cs
Step 4 : 在 Button(Script)
關(guān)聯(lián) 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. 通過(guò)直接綁定腳本來(lái)綁定事件
Step 1 : 通過(guò) Hierarchy 面板創(chuàng)建 UI > Button
.
Step 2 : 創(chuàng)建一個(gè) ClickHandler.cs 腳本, 定義了一個(gè)私有方法 OnClick(), 并在 Start() 方法里為 Button 添加點(diǎn)擊事件的監(jiān)聽(tīng),作為參數(shù)傳入 OnClick 方法.
Step 3 : 將 ClickHandler 綁定在 Button 對(duì)象上.
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. 通過(guò) EventTrigger 實(shí)現(xiàn)按鈕點(diǎn)擊事件
UGUI 系統(tǒng)中 Button 默認(rèn)只提供了 OnClick 的調(diào)用方法, 有時(shí)候我們還需要監(jiān)聽(tīng)鼠標(biāo)進(jìn)入事件 (MouseIn) 和鼠標(biāo)滑出事件 (MouseOut). 就需要借助 UI 系統(tǒng)中的 EventTrigger 腳本來(lái)實(shí)現(xiàn).
Step 1 : 通過(guò) Hierarchy 面板創(chuàng)建 UI > Button
.
Step 2 : 創(chuàng)建一個(gè) EventTriggerHandler.cs 腳本, 利用 UnityEngine.EventSystems.EventTrigger 添加監(jiān)聽(tīng)事件.
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 (); // 鼠標(biāo)點(diǎn)擊事件 entry.eventID = EventTriggerType.PointerClick; // 鼠標(biāo)進(jìn)入事件 entry.eventID = EventTriggerType.PointerEnter; // 鼠標(biāo)滑出事件 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. 通過(guò) MonoBehaviour 實(shí)現(xiàn)事件類接口來(lái)實(shí)現(xiàn)事件的監(jiān)聽(tīng)
Step 1 : 通過(guò) Hierarchy 面板創(chuàng)建 UI > Button
.
Step 2 : 創(chuàng)建一個(gè) EventHandler.cs 腳本.
Step 3 : 將腳本綁定在 Button 對(duì)象上.
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 元素被點(diǎn)擊時(shí)是鼠標(biāo)的哪個(gè)按鍵, 上面的代碼中我們可以根據(jù) eventData.pointerId 來(lái)監(jiān)聽(tīng)是鼠標(biāo)左鍵還是右鍵. 但是每個(gè) UI 元素都創(chuàng)建一個(gè) MonoBehaviour 來(lái)監(jiān)聽(tīng)各個(gè)事件顯然不好, 下面是通過(guò)利用 Delegate 和 Event 來(lái)做一個(gè)通用類 UIEventListener 來(lái)處理事件 (觀察者模式).
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); // 鼠標(biāo)點(diǎn)擊事件 public event UIEventProxy OnClick; // 鼠標(biāo)進(jìn)入事件 public event UIEventProxy OnMouseEnter; // 鼠標(biāo)滑出事件 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 結(jié)構(gòu)
代碼 : Here
到此這篇關(guān)于Unity UGUI 按鈕綁定事件的 4 種方式的文章就介紹到這了,更多相關(guān)Unity UGUI 按鈕綁定事件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中BitConverter.ToUInt16()和BitConverter.ToString()的簡(jiǎn)單使用
這篇文章主要介紹了C#中BitConverter.ToUInt16()和BitConverter.ToString()的簡(jiǎn)單使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02C#開發(fā)簡(jiǎn)易winform計(jì)算器程序
這篇文章主要為大家詳細(xì)介紹了C#開發(fā)簡(jiǎn)易winform計(jì)算器程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02解決C#運(yùn)行程序修改數(shù)據(jù)后數(shù)據(jù)表不做更新的問(wèn)題
近日,在使用C#連接數(shù)據(jù)庫(kù)的時(shí)候,對(duì)數(shù)據(jù)庫(kù)中的表做更新后,在當(dāng)前啟動(dòng)項(xiàng)目中去顯示表數(shù)據(jù)時(shí)雖然會(huì)發(fā)生一個(gè)更新,但是在結(jié)束程序運(yùn)行后再去觀察數(shù)據(jù)表中的記錄時(shí)發(fā)現(xiàn)并沒(méi)有發(fā)生一個(gè)變化,所以本文給大家解決一下這個(gè)問(wèn)題,需要的朋友可以參考下2023-08-08通過(guò)App.xaml理解wpf中的Application類
這篇文章主要介紹了通過(guò)App.xaml理解wpf中的Application類,幫助大家更好的理解和學(xué)習(xí)使用c# wpf,感興趣的朋友可以了解下2021-04-04C/C++與Java各數(shù)據(jù)類型所占字節(jié)數(shù)的詳細(xì)比較
本篇文章主要是對(duì)C/C++與Java各數(shù)據(jù)類型所占字節(jié)數(shù)進(jìn)行了詳細(xì)的對(duì)比。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01WinForm實(shí)現(xiàn)程序一段時(shí)間不運(yùn)行自動(dòng)關(guān)閉的方法
這篇文章主要介紹了WinForm實(shí)現(xiàn)程序一段時(shí)間不運(yùn)行自動(dòng)關(guān)閉的方法,涉及WinForm計(jì)時(shí)器及進(jìn)程操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09