当前位置:   article > 正文

Unity3D实现UI的单击、双击、拖动状态判断_unity ui 按下

unity ui 按下

系列文章目录

unity知识点


一、 前言

这篇文章就来实现UI的单击、双击、按压、拖动的不同状态判断。不定时更新Unity开发技巧,觉得有用记得一键三连哦。


二、鼠标的点击事件

2-1 鼠标输入的API

示例、

       if (Input.GetMouseButtonDown (0))  //左键点击
        {

        }
        if (Input.GetMouseButtonDown(1))  //右键点击
        {

        }
        if (Input.GetMouseButtonDown(2))  //中键点击
        {

        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

三、UI的点击事件

3-1 UI点击事件API

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

public class Btn_OnClick : MonoBehaviour,IPointerClickHandler,IPointerDownHandler,IPointerUpHandler,IPointerExitHandler
  • 1

3-1-1 所引用的命名空间

using UnityEngine.EventSystems;
  • 1

3-2 代码如下

示例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Btn_OnClick : MonoBehaviour,IPointerClickHandler,IPointerDownHandler,IPointerUpHandler,IPointerExitHandler
{
    public void OnPointerClick(PointerEventData eventData) //鼠标点击UI
    {
       
    }

    public void OnPointerDown(PointerEventData eventData) //鼠标按下UI
    {
      
    }

    public void OnPointerExit(PointerEventData eventData) //鼠标离开UI
    {
       
    }

    public void OnPointerUp(PointerEventData eventData)//鼠标点击UI后抬起
    {
        
    }
 }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

知道了API,下面就在这个基础上进行修改

四、使用步骤

4-1 实现UI的单价、双击、按压、拖动的不同状态判断

代码如下(示例):

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

public class Btn_OnClick : MonoBehaviour,IPointerClickHandler,IPointerDownHandler,IPointerUpHandler,IPointerExitHandler
{
    // 按压的持续时间
    public float pressDurationTime = 1;
    // 按压的响应次数
    public bool responseOnceByPress = false;
    // 双击的间隔时间
    public float doubleClickIntervalTime = 0.2f;
    // 拖动的间隔时间
    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;//点击后的拖动位置

    Btn_OnClick btn;

    void Start()
    {
        btn = GetComponent<Btn_OnClick>();
        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 (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;
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134

4-2 效果如下

在这里插入图片描述

4-3 录屏

五、Model的鼠标点击事件

5-1. 第一步新建一个模型Cube

5-2. 第二步新建一个脚本挂在Cube上面

5-3. OnMouseEnter当鼠标进入碰撞器的时候触发

在这里插入图片描述

5-4. OnMouseExit当鼠标离开碰撞盒的时候触发

在这里插入图片描述

5-5. OnMouseUpAsButton当鼠标在碰撞器上按下并松开的时候触发

在这里插入图片描述

5-6. 实现如下

完整代码示例如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 脚本挂到模型上,模型必须有碰撞盒
/// </summary>
public class Cube_OnClick : MonoBehaviour
{
    /// <summary>
    /// 当鼠标进入碰撞器的时候触发
    /// </summary>
    private void OnMouseEnter()
    {
        Debug.Log("进入了");
    }
    /// <summary>
    ///当鼠标离开碰撞盒的时候触发
    /// </summary>
    private void OnMouseExit()
    {
        Debug.Log("离开了");
    }
    /// <summary>
    /// 当鼠标在碰撞器上按下并松开的时候触发
    /// </summary>
    private void OnMouseUpAsButton()
    {
        Debug.Log("点击了模型");
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

六、最终效果

UnityUI点击模型点击


总结

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。
你的点赞就是对博主的支持,有问题记得评论留言

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/247409
推荐阅读
相关标签
  

闽ICP备14008679号