UGUI 长按和点击同步

2021-03-08 15:36发布

长按和点击一起实现:

先看看UGUI的几个接口:

using UnityEngine.EventSystems; 监听事件的命名空间

1)IPointerEnterHandler - OnPointerEnter - 指针进入事件  

       public void  OnPointerEnter(PointerEventData eventData);

      

      2)IPointerExitHandler - OnPointerExit - 指针退出事件      

      public void OnPointerExit(PointerEventData eventData);

      

      3)IPointerDownHandler - OnPointerDown - 指针按下事件     

      public voidOnPointerDown(PointerEventData eventData);

      

      4)IPointerUpHandler - OnPointerUp  -指针释放(抬起)事件

           (可能按下时的指针位置跟释放时的指针位置不同,这里指的    是按下时指针指着的物体)

           public void OnPointerUp(PointerEventData eventData);

      

      5)IPointerClickHandler - OnPointerClick - 在同一物体上按下并释放(点击事件)

           public void OnPointerClick(PointerEventData eventData);

      

      6)IInitializePotentialDragHandler - OnInitializePotentialDrag -拖拽时的初始化

           跟IPointerDownHandler差不多,在按下时调用

           public void OnInitializePotentialDrag(PointerEventData eventData);

      

      7)IBeginDragHandler - OnBeginDrag - 开始拖拽事件

           public void OnBeginDrag(PointerEventData eventData);

      

      8)IDragHandler - OnDrag - 拖拽中事件

           public void OnDrag(PointerEventData eventData);

      

      9)IEndDragHandler - OnEndDrag - 拖拽结束(被拖拽的物体调用)

           public void OnEndDrag(PointerEventData eventData);

      

      10)IDropHandler - OnDrop - 拖拽结束(拖拽结束后的位置(即鼠标位置)如果有物体,则那个物体调用)

            public void OnDrop(PointerEventData eventData);

      

      11)IScrollHandler - OnScroll - 滚轮滚动事件

            public void OnScroll(PointerEventData eventData);

      

      12)IUpdateSelectedHandler - OnUpdateSelected - 被选中的物体每帧调用

            public void OnUpdateSelected(BaseEventData eventData);

      

      13)ISelectHandler - OnSelect -物体被选中时

    (EventSystem.current.SetSelectedGameObject(gameObject))

            public void OnSelect(BaseEventData eventData);

      

      14)IDeselectHandler - OnDeselect -取消选择事件

            public void OnDeselect(BaseEventData eventData);

      

      15)IMoveHandler - OnMove - 物体移动时

            (与InputManager里的Horizontal和Vertica按键相对应),前提条件是物体被选中

            public void OnMove(AxisEventData eventData);

      

      16)ISubmitHandler - OnSubmit -  提交按钮被按下时

      (与InputManager里的Submit按键相对应,PC上默认的是Enter键),前提条件是物体被中

           public void OnSubmit(BaseEventData eventData);

      

      17)ICancelHandler - OnCancel -取消按钮被按下时

    (与InputManager里的Cancel按键相对应,PC上默认的是Esc键),前提条件是物体被选中

            public void OnCancel(BaseEventData eventData);

OK,下面使用这里面几个接口解决我们的问题:


简化的问题描述 : 长按显示出可编辑状态,单机结束可编辑状态,,,

这两个功能单一实现起来并不难,,,可是放在一起使用,弄了半天才搞出来,分享一下,也便于以后使用,,,


ps:移动端(Android)我之前也实现过:https://blog.csdn.net/Czhenya/article/details/78237265


代码如下:


using UnityEngine;

using UnityEngine.Events;

using UnityEngine.EventSystems;



/// <summary>

/// 长按背景,进入可编辑状态

/// </summary>

public class ButtonLongPress : UIBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler, IPointerClickHandler

{


    [Tooltip("按下多长时间触发长按")]

    public float duration = 1.0f;


    public UnityEvent onLongPress = new UnityEvent();

    public UnityEvent onClick = new UnityEvent();


    private bool isDown = false;

    private bool longPress = false;

    private float touchTime;


    private void Update()

    {

        if (isDown && !longPress)

        {

            if (Time.time - touchTime > duration )

            {

                longPress = true;

                //长按

                LongPress();

            }

        }

    }


    public void OnPointerDown(PointerEventData eventData) //按下执行

    {

        touchTime = Time.time;

        isDown = true;

        longPress = false;

    }


    public void OnPointerUp(PointerEventData eventData) //抬起执行

    {

        isDown = false;

    }

    public void OnPointerExit(PointerEventData eventData) //离开执行

    {

        isDown = false;

    }

    

//长按方法执行了,就不执行点击,,,反之亦然...

    public void OnPointerClick(PointerEventData eventData)

    {

        if (!longPress)

        {

            PressDowm();

        }

    }


    /// <summary>

    /// 长按 

    /// </summary>

    private void LongPress()  //  todo...方法中实现,要做的事情

    {

        for (int i = 0; i < 6; i++)

        {

            this.transform.parent.GetChild(3).GetChild(4).GetChild(1).GetChild(i).GetChild(0).gameObject.SetActive(true);

            //this.transform.GetComponent<LobbyImgYoYo>().enabled = true;

            this.transform.parent.GetChild(3).GetChild(4).GetChild(1).GetChild(i).GetComponent<LobbyImgYoYo>().enabled = true;

        }


    }


    /// <summary>

    /// 点击

    /// </summary>

    private void PressDowm()

    {

        for (int i = 0; i < 6; i++)

        {

            this.transform.parent.GetChild(3).GetChild(4).GetChild(1).GetChild(i).GetChild(0).gameObject.SetActive(false);

            this.transform.parent.GetChild(3).GetChild(4).GetChild(1).GetChild(i).GetComponent<LobbyImgYoYo>().enabled = false;

            

        }



    }


}



————————————————

版权声明:本文为CSDN博主「妳是我改卟了的bug」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Czhenya/article/details/82762637