长按和点击一起实现:
先看看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;
}
}
}