QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 1958|回复: 0

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

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1295 小时
   最后登录 : 2024-11-24

丰功伟绩

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

联系方式
发表于 2021-4-10 22:34:58 | 显示全部楼层 |阅读模式
      这里主要介绍了Unity 按钮事件封装操作(EventTriggerListener),具有很好的参考价值,废话不多说,直接上代码:$ u6 {' T% c0 I( O6 t
  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类,专门用于添加事件。
2 j( k, U8 m2 j4 @       EventTriggerListener类,不需要挂载到物体上,继承EventTrigger,作为Common类直接使用:! Z7 }. x+ d9 d, R" l4 t+ W- {

  j( V# M- t/ I
  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:
5 s5 d1 Z" b5 o* r0 I- _) x' Y
  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. }
      运行结果:
; W& }( t3 \1 G 1.jpg
& }* V1 D+ u5 r0 m5 k* p       PS:单击和双击事件的同时监听会有冲突,所以通过Invoke()检测300ms内点击次数,每次按钮按下的时候检测。
! x9 p6 O7 T; u/ \
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-24 11:21

Powered by paopaomj X3.5 © 2016-2025 sitemap

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