Unity 按鈕事件封裝操作(EventTriggerListener)
我就廢話不多說了,大家還是直接看代碼吧~
using UnityEngine; using UnityEngine.EventSystems; namespace Mx.UI { public class EventTriggerListener :UnityEngine.EventSystems.EventTrigger { public delegate void VoidDelegate(GameObject go); public VoidDelegate onClick; public VoidDelegate onDown; public VoidDelegate onEnter; public VoidDelegate onExit; public VoidDelegate onUp; public VoidDelegate onSelect; public VoidDelegate onUpdateSelect; /// <summary> /// 得到“監(jiān)聽器”組件 /// </summary> /// <param name="go">監(jiān)聽的游戲?qū)ο?lt;/param> /// <returns> /// 監(jiān)聽器 /// </returns> public static EventTriggerListener Get(GameObject go) { EventTriggerListener lister = go.GetComponent<EventTriggerListener>(); if (lister==null) { lister = go.AddComponent<EventTriggerListener>(); } return lister; } public override void OnPointerClick(PointerEventData eventData) { if (onClick != null) { onClick(gameObject); } } public override void OnPointerDown(PointerEventData eventData) { if (onDown != null) { onDown(gameObject); } } public override void OnPointerEnter(PointerEventData eventData) { if (onEnter != null) { onEnter(gameObject); } } public override void OnPointerExit(PointerEventData eventData) { if (onExit != null) { onExit(gameObject); } } public override void OnPointerUp(PointerEventData eventData) { if (onUp != null) { onUp(gameObject); } } public override void OnSelect(BaseEventData eventBaseData) { if (onSelect != null) { onSelect(gameObject); } } public override void OnUpdateSelected(BaseEventData eventBaseData) { if (onUpdateSelect != null) { onUpdateSelect(gameObject); } } }//Class_end }
補(bǔ)充:Unity學(xué)習(xí)筆記——自定義EventTriggerListener事件
通常我們在Unity給按鈕或者圖片添加EventeTrigger事件都需要手動添加組件,或者通過代碼繼承系統(tǒng)提供接口實(shí)現(xiàn)功能。這樣使用起來比較麻煩,所以我參考網(wǎng)上資料總結(jié)寫了一個自定義的EventTriggerListener類,專門用于添加事件。
EventTriggerListener類,不需要掛載到物體上,繼承EventTrigger,作為Common類直接使用
using UnityEngine; using UnityEngine.EventSystems; public class EventTriggerListener : EventTrigger { public delegate void voidDelegate(GameObject obj); public voidDelegate OnBtnDown; public voidDelegate OnBtnUp; public voidDelegate OnEnter; public voidDelegate OnExit; public voidDelegate OnStay; public voidDelegate OnClick; public voidDelegate OnDoubleClick; private float t1, t2; private bool isEnter = false; public void Update() { if (isEnter) { if (OnStay != null) { OnStay(gameObject); } } } public static EventTriggerListener Get(GameObject obj) { EventTriggerListener eventTriggerListener = obj.GetComponent<EventTriggerListener>(); if (eventTriggerListener == null) { eventTriggerListener = obj.AddComponent<EventTriggerListener>(); } return eventTriggerListener; } /// <summary> /// 判斷是否是第二次點(diǎn)擊 /// </summary> private bool isTwo = true; private bool isOver = true; public override void OnPointerDown(PointerEventData eventData) { if (OnBtnDown != null) { OnBtnDown(gameObject); } isTwo = !isTwo; if (!isOver) { return; } isOver = false; Invoke("SelectClick", 0.3f); } public void SelectClick() { if (isTwo) { if (OnDoubleClick!=null) { OnDoubleClick(gameObject); } } else { if (OnClick!=null) { OnClick(gameObject); } } isTwo = true; isOver = true; } public override void OnPointerUp(PointerEventData eventData) { if (OnBtnUp != null) { OnBtnUp(gameObject); } } public override void OnPointerEnter(PointerEventData eventData) { if (OnEnter != null) { OnEnter(gameObject); } isEnter = true; } public override void OnPointerExit(PointerEventData eventData) { if (OnExit != null) { OnExit(gameObject); } isEnter = false; } }
以上是最常見的幾種事件,全部事件可以查看EventTrigger類。
使用方法:新建腳本BtnEvent,繼承MonoBehaviour掛載到場景物體中,在Start()周期函數(shù)中給需要添加事件的物體添加事件(我這里直接掛載到需要注冊事件的按鈕上)其中g(shù)ameObject是需要添加的物體gameObject
using UnityEngine; public class BtnEvent : MonoBehaviour { void Start () { EventTriggerListener.Get(transform.gameObject).OnClick += (gameobj) => { Debug.Log("onclick"); }; EventTriggerListener.Get(transform.gameObject).OnBtnDown += (gameobj) => { Debug.Log("OnBtnDown"); }; EventTriggerListener.Get(transform.gameObject).OnBtnUp += (gameobj) => { Debug.Log("OnBtnUp"); }; EventTriggerListener.Get(transform.gameObject).OnEnter += (gameobj) => { Debug.Log("OnEnter"); }; EventTriggerListener.Get(transform.gameObject).OnExit += (gameobj) => { Debug.Log("OnExit"); }; EventTriggerListener.Get(transform.gameObject).OnDoubleClick += (gameobj) => { Debug.Log("OnDoubleClick"); }; EventTriggerListener.Get(transform.gameObject).OnStay += (gameobj) => { Debug.Log("OnStay"); }; } }
運(yùn)行結(jié)果:
PS:單擊和雙擊事件的同時監(jiān)聽會有沖突,所以通過Invoke()檢測300ms內(nèi)點(diǎn)擊次數(shù),每次按鈕按下的時候檢測。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
C#用遞歸算法實(shí)現(xiàn):一列數(shù)的規(guī)則如下: 1、1、2、3、5、8、13、21、34,求第30位數(shù)是多少
本文主要介紹三種方法,解決面試中常見的問題,求第30位數(shù)是多少的問題,希望能給大家一個參考。2016-06-06C#實(shí)現(xiàn)多線程的Web代理服務(wù)器實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)多線程的Web代理服務(wù)器,涉及C#多線程代理服務(wù)器的實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07sqlserver備份還原數(shù)據(jù)庫功能封裝分享
這篇文章主要介紹了sqlserver備份還原數(shù)據(jù)庫功能封裝示例,需要的朋友可以參考下2014-03-03基于動態(tài)修改App.Config與web.Config的使用詳解
本篇文章是對動態(tài)修改App.Config與web.Config的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C#實(shí)現(xiàn)百分比轉(zhuǎn)小數(shù)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)百分比轉(zhuǎn)小數(shù)的方法,涉及C#進(jìn)行數(shù)值計(jì)算的相關(guān)技巧,需要的朋友可以參考下2015-06-06