点击事件+长按实现
事件:玩家和游戏交互的一种方式
键盘、鼠标、手柄、麦克风、重力检测,触摸,VR(手柄,眼镜)
自定义点击实现
由于Unity是组件化开发思想,所以自定义按钮也是使用组件Script实现
编写自定义事件步骤
1.引入自定义事件命名空间(UnityEngine.EventSystems)
2.实现自定义事件Interface
3.用户交互会触发回调函数
点击事件接口系列
IPointerEnterHandler:鼠标光标移入射线检测区域,触发回调函数
IPointerExitHandler:鼠标光标移出射线检测区域,触发回调函数
IPointerDownHandler:鼠标在射线检测区域中按下,触发回调函数
IPointerUpHandler
前提:需要先触发按下事件
情况1:鼠标在射线检测区域中按下并抬起(正常点击)
情况2:鼠标在射线检测区域中按下,移出射线检测区域后抬起(点击后取消)
IPointerClickHandler:鼠标在射线检测区域中按下并抬起,触发回调函数,Up的情况2是不会触发Click事件的。
//如果自定义事件,需要引入Unity的事件系统命名空间
using UnityEngine.EventSystems;
public class MyButton:MonoBehaviour,
IPointerEnterHandler,IPointerExitHandler,
IPointerDownHandler,IPointerUpHandler
{
//鼠标移入射线检测区域后,执行回调函数
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("鼠标移入");
}
//显式实现接口的抽象方法(避免多个接口中,抽象方法重名)
//鼠标移出射线检测区域后,执行回调函数
void IPointerExitHandler.OnPointerExit(PointerEventData eventData)
{
Debug.Log("鼠标移出");
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("按钮已被按下,执行对应方法");
}
void IPointerUpHandler.OnPointerUp(PointerEventData eventData)
{
Debug.Log("按钮在按下后被抬起,执行对应方法");
}
//编写Start生命周期函数,组件在编辑器中才会显示
private void Start(){}
}
挂载到按钮后移入移出及按下抬起运行如下:
为脚本添加事件:
using UnityEngine.Events;//引用事件所需命名空间
public UnityEvent onClick; //在类中声明事件
onClick.Invoke();//执行onclick中添加的回调函数
长按实现
public UnityEvent OnLongClickBegin;
public UnityEvent OnLongClickEnd;
public float longClickTime=3f;
private float pressedTime = 0f;
private bool isPressed = false;
private bool isInLongClick = false; //在前代码的基础上增加的新的代码,自行修改调试
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("按钮已被按下,执行对应方法");
isPressed = true;
}
void IPointerUpHandler.OnPointerUp(PointerEventData eventData)
{
Debug.Log("按钮在按下后被抬起,执行对应方法");
pressedTime= 0;
isPressed= false;
if (isInLongClick)
{
isInLongClick= false;
OnLongClickEnd.Invoke();
}
}
private void Update()
{
//一旦开始按下按钮,则开始使用帧间距时间,记录按下的时间
if (isPressed)
{
//每帧检测,如果按下的时间超过了设置的长按阈值,则触发长按事件
if (!isInLongClick && pressedTime > longClickTime)
{
//一旦开始长按,就处于长按状态中
isInLongClick = true;
OnLongClickBegin.Invoke();
}
pressedTime += Time.deltaTime;
}
}
//挂载在onclick事件上的脚本,另起脚本
public class TestMyButton : MonoBehaviour
{
public void LongClickBegin()
{
Debug.Log("开始长按");
}
public void LongClickEnd()
{
Debug.Log("结束长按");
}
}
该系列专栏为网课课程笔记,仅用于学习参考。