推荐阅读
- CSDN主页
- GitHub开源地址
- Unity3D插件分享
- 简书地址
- 我的个人博客
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新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之UGUI | UGUI | Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。 |
Unity3D之读取数据 | 文件读取 | 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。 |
Unity3D之数据集合 | 数据集合 | 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。 |
Unity3D之VR/AR(虚拟仿真)开发 | 虚拟仿真 | 总结博主工作常见的虚拟仿真需求进行案例讲解。 |
Unity3D之插件 | 插件 | 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等 |
Unity3D之日常开发 | 日常记录 | 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等 |
Unity3D之日常BUG | 日常记录 | 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。 |