zoukankan      html  css  js  c++  java
  • Unity UGUI Button扩展

    由于UGUI中的Button组件只能添加Click一种事件有一定的局限性,如果我要做当按钮被按下时并且手指不离开屏幕让按钮缩小如果只用Click事件当手指滑动到其他地方后就没办法恢复到按钮原来的大小了。还比如我没还要检测手指在按钮上滑动的距离这时Button组件明显也不满足需求。所以我就根据UGUI中Button组件的源码写了拥有按下、抬起、离开按钮、开始滑动、停止滑动、滑动等事件的组件代码如下:

      1 using System;
      2 
      3 using UnityEngine;
      4 using UnityEngine.Events;
      5 using UnityEngine.EventSystems;
      6 using UnityEngine.Serialization;
      7 using UnityEngine.UI;
      8 
      9 [AddComponentMenu("UGUIExpend/UITouch", 30)]
     10 public class UITouch : Selectable, IBeginDragHandler, IDragHandler, IEndDragHandler
     11 {
     12     [Serializable]
     13     public class TouchEvent : UnityEvent
     14     {
     15         public PointerEventData  eventData = default;
     16     }
     17 
     18     [SerializeField]
     19     private TouchEvent m_OnTouchDown = new TouchEvent();
     20 
     21     [SerializeField]
     22     private TouchEvent m_OnTouchUp = new TouchEvent();
     23 
     24     [SerializeField]
     25     private TouchEvent m_OnTouchExit = new TouchEvent();
     26 
     27     [SerializeField]
     28     private TouchEvent m_OnBeginSlide = new TouchEvent();
     29 
     30     [SerializeField]
     31     private TouchEvent m_OnSlide = new TouchEvent();
     32 
     33     [SerializeField]
     34     private TouchEvent m_OnEndSlide = new TouchEvent();
     35 
     36     protected UITouch(){}
     37     public TouchEvent OnTouchDown
     38     {
     39         get { return this.m_OnTouchDown; }
     40         set { m_OnTouchDown = value; }
     41     }
     42 
     43     public TouchEvent OnTouchUp
     44     {
     45         get { return this.m_OnTouchUp; }
     46         set { this.m_OnTouchUp = value; }
     47     }
     48 
     49     public TouchEvent OnTouchExit
     50     {
     51         get { return m_OnTouchExit; }
     52         set { m_OnTouchExit = value; }
     53     }
     54 
     55     public TouchEvent OnBeginSlider
     56     {
     57         get { return m_OnBeginSlide; }
     58         set { m_OnBeginSlide = value; }
     59     }
     60 
     61     public TouchEvent OnSlider
     62     {
     63         get { return m_OnSlide; }
     64         set { m_OnSlide = value; }
     65     }
     66     public TouchEvent OnEndSlider
     67     {
     68         get { return m_OnEndSlide; }
     69         set { m_OnEndSlide = value; }
     70     }
     71 
     72     private void touchDownOption(PointerEventData eventData)
     73     {
     74         if(!IsActive() || !IsInteractable())
     75         {
     76             return;
     77         }
     78         UISystemProfilerApi.AddMarker("UITouch.OnTouchDown",this);
     79         m_OnTouchDown.eventData = eventData;
     80         m_OnTouchDown.Invoke();
     81     }
     82 
     83     private void touchExitOption(PointerEventData eventData)
     84     {
     85         if (!IsActive() || !IsInteractable())
     86         {
     87             return;
     88         }
     89         UISystemProfilerApi.AddMarker("UITouch.OnTouchExit", this);
     90         m_OnTouchExit.eventData = eventData;
     91         m_OnTouchExit.Invoke();
     92     }
     93 
     94     private void touchUpOption(PointerEventData eventData)
     95     {
     96         if (!IsActive() || !IsInteractable())
     97         {
     98             return;
     99         }
    100         UISystemProfilerApi.AddMarker("UITouch.OnTouchUp", this);
    101         m_OnTouchUp.eventData = eventData;
    102         m_OnTouchUp.Invoke();
    103     }
    104 
    105     private void slideOption(PointerEventData eventData)
    106     {
    107         if (!IsActive() || !IsInteractable())
    108         {
    109             return;
    110         }
    111         UISystemProfilerApi.AddMarker("UITouch.OnSlider", this);
    112         m_OnSlide.eventData = eventData;
    113         m_OnSlide.Invoke();
    114     }
    115     private void beginSlideOption(PointerEventData eventData)
    116     {
    117         if (!IsActive() || !IsInteractable())
    118         {
    119             return;
    120         }
    121         UISystemProfilerApi.AddMarker("UITouch.OnSlider", this);
    122         m_OnBeginSlide.eventData = eventData;
    123         m_OnBeginSlide.Invoke();
    124     }
    125     private void endSlideOption(PointerEventData eventData)
    126     {
    127         if (!IsActive() || !IsInteractable())
    128         {
    129             return;
    130         }
    131         UISystemProfilerApi.AddMarker("UITouch.OnSlider", this);
    132         m_OnEndSlide.eventData = eventData;
    133         m_OnEndSlide.Invoke();
    134     }
    135     public override void OnPointerDown(PointerEventData eventData)
    136     {
    137         if (eventData.button != PointerEventData.InputButton.Left)
    138         {
    139             return;
    140         }
    141         touchDownOption(eventData);
    142     }
    143     public override void OnPointerUp(PointerEventData eventData)
    144     {
    145         if(eventData.button != PointerEventData.InputButton.Left)
    146         {
    147             return;
    148         }
    149         touchUpOption(eventData);
    150     }
    151     public override void OnPointerExit(PointerEventData eventData)
    152     {
    153         if (eventData.button != PointerEventData.InputButton.Left)
    154         {
    155             return;
    156         }
    157         touchExitOption(eventData);
    158     }
    159 
    160     public void OnBeginDrag(PointerEventData eventData)
    161     {
    162         if (eventData.button != PointerEventData.InputButton.Left)
    163         {
    164             return;
    165         }
    166         beginSlideOption(eventData);
    167         //throw new NotImplementedException();
    168     }
    169 
    170     public void OnDrag(PointerEventData eventData)
    171     {
    172         if (eventData.button != PointerEventData.InputButton.Left)
    173         {
    174             return;
    175         }
    176         slideOption(eventData);
    177     }
    178 
    179     public void OnEndDrag(PointerEventData eventData)
    180     {
    181         if (eventData.button != PointerEventData.InputButton.Left)
    182         {
    183             return;
    184         }
    185         endSlideOption(eventData);
    186     }
    187 }

     

  • 相关阅读:
    POJ 1659 Frogs' Neighborhood
    zoj 2913 Bus Pass(BFS)
    ZOJ 1008 Gnome Tetravex(DFS)
    POJ 1562 Oil Deposits (DFS)
    zoj 2165 Red and Black (DFs)poj 1979
    hdu 3954 Level up
    sgu 249 Matrix
    hdu 4417 Super Mario
    SPOJ (BNUOJ) LCM Sum
    hdu 2665 Kth number 划分树
  • 原文地址:https://www.cnblogs.com/sy-liu/p/12860034.html
Copyright © 2011-2022 走看看