当前位置: 首页 > news >正文

点击事件+长按实现

事件:玩家和游戏交互的一种方式

        键盘、鼠标、手柄、麦克风、重力检测,触摸,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("结束长按");
    }
}

该系列专栏为网课课程笔记,仅用于学习参考。

相关文章:

  • 如何在ubuntu上安装zookeeper
  • 3DXML 与 SOLIDWORKS 格式转换:技术协同及迪威模型方案
  • 在 Vue 项目中引入静态图片有多种方式
  • 基于PyQt5与Open3D的轻量化BIM工具开发指南(上)‌
  • 从 0 到 1 掌握鸿蒙 AudioRenderer 音频渲染:我的自学笔记与踩坑实录(API 14)
  • npm 报错 unable to resolve dependency tree
  • C++学习之云盘项目nginx
  • C++继承 ---- 继承是面向对象三大特性之一【好处:可以减少重复的代码】
  • Z 轴热膨胀系数:PCB 可靠性的关键因素与选材策略
  • 笔记本电脑关不了机是怎么回事 这有解决方法
  • 【R语言】二项分布,正态分布,极大似然估计实现
  • PC企业微信HOOK / iPad企业微信协议最新版研究
  • 神经网络量化2-pytorch测试动态量化
  • FPGA-流水灯
  • vulhub/joker 靶机----练习攻略
  • 基于Java(Springboot+Gradle+Mybatis+templeaf 框架)+Mysql构建的(Web)校园二手平台系统
  • on-policy对比off-policy
  • 微服务的网关配置
  • 厨卫行业供应链产销协同前中后大平台现状需求分析报告+P120(120页PPT)(文末有下载方式)
  • Java面试黄金宝典2
  • 泽连斯基已离开土耳其安卡拉
  • 共建医学人工智能高地,上海卫健委与徐汇区将在这些方面合作
  • 女孩患异食癖爱吃头发,一年后腹痛入院体内惊现“头发巨石”
  • 4月企业新发放贷款利率处于历史低位
  • 京东美团饿了么等外卖平台被约谈
  • 著名连环画家庞邦本逝世