QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

泡泡马甲APP 更多内容请下载泡泡马甲手机客户端APP 立即下载 ×
查看: 1875|回复: 0

[C#] Unity按钮事件封装操作(EventTriggerListener)

[复制链接]

等级头衔

积分成就    金币 : 2804
   泡泡 : 1516
   精华 : 6
   在线时间 : 1243 小时
   最后登录 : 2024-5-2

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-4-10 22:34:58 | 显示全部楼层 |阅读模式
      这里主要介绍了Unity 按钮事件封装操作(EventTriggerListener),具有很好的参考价值,废话不多说,直接上代码:
. i! y8 V5 X, g- r: i% h
  1. using UnityEngine;
  2. using UnityEngine.EventSystems;
  3. namespace Mx.UI
  4. {
  5.     public class EventTriggerListener :UnityEngine.EventSystems.EventTrigger
  6.     {
  7.         public delegate void VoidDelegate(GameObject go);
  8.         public VoidDelegate onClick;
  9.         public VoidDelegate onDown;
  10.         public VoidDelegate onEnter;
  11.         public VoidDelegate onExit;
  12.         public VoidDelegate onUp;
  13.         public VoidDelegate onSelect;
  14.         public VoidDelegate onUpdateSelect;
  15.         /// <summary>
  16.         /// 得到“监听器”组件
  17.         /// </summary>
  18.         /// <param name="go">监听的游戏对象</param>
  19.         /// <returns>
  20.         /// 监听器
  21.         /// </returns>
  22.         public static EventTriggerListener Get(GameObject go)
  23.         {
  24.             EventTriggerListener lister = go.GetComponent<EventTriggerListener>();
  25.             if (lister==null)
  26.             {
  27.                 lister = go.AddComponent<EventTriggerListener>();               
  28.             }
  29.             return lister;
  30.         }
  31.         public override void OnPointerClick(PointerEventData eventData)
  32.         {
  33.             if (onClick != null)
  34.             {
  35.                 onClick(gameObject);
  36.             }
  37.         }
  38.         public override void OnPointerDown(PointerEventData eventData)
  39.         {
  40.             if (onDown != null)
  41.             {
  42.                 onDown(gameObject);
  43.             }
  44.         }
  45.         public override void OnPointerEnter(PointerEventData eventData)
  46.         {
  47.             if (onEnter != null)
  48.             {
  49.                 onEnter(gameObject);
  50.             }
  51.         }
  52.         public override void OnPointerExit(PointerEventData eventData)
  53.         {
  54.             if (onExit != null)
  55.             {
  56.                 onExit(gameObject);
  57.             }
  58.         }
  59.         public override void OnPointerUp(PointerEventData eventData)
  60.         {
  61.             if (onUp != null)
  62.             {
  63.                 onUp(gameObject);
  64.             }
  65.         }
  66.    
  67.         public override void OnSelect(BaseEventData eventBaseData)
  68.         {
  69.             if (onSelect != null)
  70.             {
  71.                 onSelect(gameObject);
  72.             }
  73.         }
  74.         public override void OnUpdateSelected(BaseEventData eventBaseData)
  75.         {
  76.             if (onUpdateSelect != null)
  77.             {
  78.                 onUpdateSelect(gameObject);
  79.             }
  80.         }       
  81.     }//Class_end
  82. }
      通常我们在Unity给按钮或者图片添加EventeTrigger事件都需要手动添加组件,或者通过代码继承系统提供接口实现功能。这样使用起来比较麻烦,所以参考网上资料总结写了一个自定义的EventTriggerListener类,专门用于添加事件。; y8 Q0 G7 C6 i  h8 i0 S
       EventTriggerListener类,不需要挂载到物体上,继承EventTrigger,作为Common类直接使用:& ^/ r2 Q0 x' Z
0 y$ \" {% \' V0 g" z
  1. using UnityEngine;
  2. using UnityEngine.EventSystems;
  3. public class EventTriggerListener : EventTrigger
  4. {
  5.     public delegate void voidDelegate(GameObject obj);
  6.     public voidDelegate OnBtnDown;
  7.     public voidDelegate OnBtnUp;
  8.     public voidDelegate OnEnter;
  9.     public voidDelegate OnExit;
  10.     public voidDelegate OnStay;
  11.     public voidDelegate OnClick;
  12.     public voidDelegate OnDoubleClick;
  13.     private float t1, t2;
  14.     private bool isEnter = false;
  15.     public void Update()
  16.     {
  17.         if (isEnter)
  18.         {
  19.             if (OnStay != null)
  20.             {
  21.                 OnStay(gameObject);
  22.             }
  23.         }
  24.     }
  25.     public static EventTriggerListener Get(GameObject obj)
  26.     {
  27.         EventTriggerListener eventTriggerListener = obj.GetComponent<EventTriggerListener>();
  28.         if (eventTriggerListener == null)
  29.         {
  30.             eventTriggerListener = obj.AddComponent<EventTriggerListener>();
  31.         }
  32.         return eventTriggerListener;
  33.     }
  34.     /// <summary>
  35.     /// 判断是否是第二次点击
  36.     /// </summary>
  37.     private bool isTwo = true;
  38.     private bool isOver = true;
  39.     public override void OnPointerDown(PointerEventData eventData)
  40.     {
  41.         if (OnBtnDown != null)
  42.         {
  43.             OnBtnDown(gameObject);
  44.         }
  45.         isTwo = !isTwo;
  46.         if (!isOver)
  47.         {
  48.             return;
  49.         }
  50.         isOver = false;
  51.         Invoke("SelectClick", 0.3f);
  52.       
  53.     }
  54.     public void SelectClick()
  55.     {
  56.         if (isTwo)
  57.         {
  58.             if (OnDoubleClick!=null)
  59.             {
  60.                 OnDoubleClick(gameObject);
  61.             }
  62.         }
  63.         else
  64.         {
  65.             if (OnClick!=null)
  66.             {
  67.                 OnClick(gameObject);
  68.             }
  69.         }
  70.         isTwo = true;
  71.         isOver = true;
  72.     }
  73.     public override void OnPointerUp(PointerEventData eventData)
  74.     {
  75.         if (OnBtnUp != null)
  76.         {
  77.             OnBtnUp(gameObject);
  78.         }
  79.     }
  80.     public override void OnPointerEnter(PointerEventData eventData)
  81.     {
  82.         if (OnEnter != null)
  83.         {
  84.             OnEnter(gameObject);
  85.         }
  86.         isEnter = true;
  87.     }
  88.     public override void OnPointerExit(PointerEventData eventData)
  89.     {
  90.         if (OnExit != null)
  91.         {
  92.             OnExit(gameObject);
  93.         }
  94.         isEnter = false;
  95.     }
  96. }
      使用方法:新建脚本BtnEvent,继承MonoBehaviour挂载到场景物体中,在Start()周期函数中给需要添加事件的物体添加事件(这里直接挂载到需要注册事件的按钮上)其中gameObject是需要添加的物体gameObject:
9 W# v% d$ |/ I8 H4 l
  1. using UnityEngine;
  2. public class BtnEvent : MonoBehaviour {
  3.         void Start () {
  4.         EventTriggerListener.Get(transform.gameObject).OnClick += (gameobj) => { Debug.Log("onclick"); };
  5.         EventTriggerListener.Get(transform.gameObject).OnBtnDown += (gameobj) => { Debug.Log("OnBtnDown"); };
  6.         EventTriggerListener.Get(transform.gameObject).OnBtnUp += (gameobj) => { Debug.Log("OnBtnUp"); };
  7.         EventTriggerListener.Get(transform.gameObject).OnEnter += (gameobj) => { Debug.Log("OnEnter"); };
  8.         EventTriggerListener.Get(transform.gameObject).OnExit += (gameobj) => { Debug.Log("OnExit"); };
  9.         EventTriggerListener.Get(transform.gameObject).OnDoubleClick += (gameobj) => { Debug.Log("OnDoubleClick"); };
  10.         EventTriggerListener.Get(transform.gameObject).OnStay += (gameobj) => { Debug.Log("OnStay"); };
  11.     }       
  12. }
      运行结果:: [, Q, z/ N3 f. [: f8 u
1.jpg

* t% u+ \, d! i# J  q) c       PS:单击和双击事件的同时监听会有冲突,所以通过Invoke()检测300ms内点击次数,每次按钮按下的时候检测。
3 B- H) f- D: Z; n0 {8 |
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号 )

GMT+8, 2024-5-4 09:36

Powered by paopaomj X3.4 © 2016-2024 sitemap

快速回复 返回顶部 返回列表