UGUI 长按和点击同步

版权声明:快乐源于分享,转载请附链接,,, https://blog.csdn.net/Czhenya/article/details/82762637

长按和点击一起实现:

先看看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;
            
        }


    }

}

猜你喜欢

转载自blog.csdn.net/Czhenya/article/details/82762637