zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【虚拟仿真】Unity3D中实现UI的单击、双击、按压、拖动的不同状态判断

状态UI 实现 判断 不同 仿真 虚拟 Unity3D
2023-09-11 14:19:57 时间

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

之前写了一篇在Unity中鼠标的单击、双击、拖动的文章:【虚拟仿真】Unity3D中实现鼠标的单击、双击、拖动的不同状态判断

有小伙伴问UI的单击、双击、拖动如何做的?

这篇文章就来实现UI的单击、双击、按压、拖动的不同状态判断。

在开始之前,我们先来回顾一下鼠标的事件判断以及如何实现UI的点击判断。

二、鼠标点击事件和UI点击事件

2-1、鼠标点击事件

鼠标点击事件就比较简单,使用鼠标的输入API事件:

API事件:

Input.GetMouseButtonDown(0);//鼠标右键单击

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ButtonOnClick : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("鼠标左键点击");
        }
    }
}

判断单击和双击的话主要判断点击的次数。

2-2、UI点击事件

UI的点击事件,需要继承UI的点击事件接口,重写点击事件即可。

UI点击事件接口:

IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler

参考代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class ButtonOnClick : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
	// 鼠标点击UI
    public void OnPointerClick(PointerEventData eventData)
    {
    }
	// 鼠标按下UI
    public void OnPointerDown(PointerEventData eventData)
    {
    }
	// 鼠标离开UI
    public void OnPointerExit(PointerEventData eventData)
    {
    }
	// 鼠标点击UI后弹起
    public void OnPointerUp(PointerEventData eventData)
    {
    }
}

知道了这些内容,接下来就在上面代码的基础上进行修改。

2-3、实现UI的单击、双击、按压、拖动的不同状态判断

参考代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class ButtonOnClick : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
    // 按压的持续时间
    public float pressDurationTime = 1;
    // 按压的响应次数
    public bool responseOnceByPress = false;
    // 双击的间隔时间
    public float doubleClickIntervalTime = 0.5f;
    // 拖动的间隔时间
    public float dragIntervalTime = 0.2f;
    // 拖动的鼠标间隔距离
    public float dragIntervalPos = 0.01f;

    public UnityEvent onDoubleClick;
    public UnityEvent onPress;
    public UnityEvent onClick;
    public UnityEvent onDrag;

    private bool isDown = false;
    private bool isPress = false;
    private bool isDrag = false;
    private float downTime = 0;

    private float clickIntervalTime = 0;
    private int clickTimes = 0;

    private Vector3 mousePosLast = Vector3.zero;//点击后的拖动位置

    ButtonOnClick btn;

    void Start()
    {
        btn = GetComponent<ButtonOnClick>();
        btn.onClick.AddListener(Click);
        btn.onPress.AddListener(Press);
        btn.onDoubleClick.AddListener(DoubleClick);
        btn.onDrag.AddListener(Drag);
    }

    void Click()
    {
        Debug.Log("单击");
    }

    void Press()
    {
        Debug.Log("按压");
    }

    void DoubleClick()
    {
        Debug.Log("双击");
    }

    void Drag()
    {
        Debug.Log("拖动");
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("鼠标左键点击");
        }

        if (isDown)
        {
            if (responseOnceByPress && isPress)
            {
                return;
            }
            downTime += Time.deltaTime;
            isDrag = Vector3.Distance(Input.mousePosition, mousePosLast) > dragIntervalPos;
            if (downTime > pressDurationTime && !isDrag)
            {
                isPress = true;
                onPress.Invoke();
            }
            if (downTime > dragIntervalTime && isDrag)
            {
                onDrag.Invoke();
            }
        }
        if (clickTimes >= 1)
        {
            clickIntervalTime += Time.deltaTime;
            if (clickIntervalTime >= doubleClickIntervalTime)
            {
                if (clickTimes >= 2)
                {
                    onDoubleClick.Invoke();
                }
                else
                {
                    onClick.Invoke();
                }
                clickTimes = 0;
                clickIntervalTime = 0;
            }
        }
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if (!isPress)
            clickTimes += 1;
        else
            isPress = false;
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        isDown = true;
        downTime = 0;
        mousePosLast = Input.mousePosition;
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        isDown = false;
        isPress = false;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isDown = false;
    }
}

效果图:
在这里插入图片描述

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。