UNITY - 如何为长按和单击/双击执行不同的操作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNITY - 如何为长按和单击/双击执行不同的操作?相关的知识,希望对你有一定的参考价值。

所以我正在制作一个2D角色控制器,如果按住鼠标(长按),玩家可以设置他想要发射射弹的方向,当射弹被射击并与物体相撞时,玩家可以点击一次(或双击,如果它更好)将角色的位置交换到射弹的位置。我正在尝试使用Input.onMouseButton和Input.onMouseButtonDown来做,但我无法弄明白。谢谢大家帮助我!

答案

长按一下,您只需要测量自第一次点击以来经过的时间量。这是一个例子:

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

public class LongClick : MonoBehaviour
{
    public float ClickDuration = 2;
    public UnityEvent OnLongClick;

    bool clicking = false;
    float totalDownTime = 0;


    // Update is called once per frame
    void Update()
    {
        // Detect the first click
        if (Input.GetMouseButtonDown(0))
        {
            totalDownTime = 0;
            clicking = true;
        }

        // If a first click detected, and still clicking,
        // measure the total click time, and fire an event
        // if we exceed the duration specified
        if (clicking && Input.GetMouseButton(0))
        {
            totalDownTime += Time.deltaTime;

            if (totalDownTime >= ClickDuration)
            {
                Debug.Log("Long click");
                clicking = false;
                OnLongClick.Invoke();
            }
        }

        // If a first click detected, and we release before the
        // duraction, do nothing, just cancel the click
        if (clicking && Input.GetMouseButtonUp(0))
        {
            clicking = false;
        }
    }
}

对于双击,您只需要检查在指定(短)间隔内是否发生第二次单击:

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

public class DoubleClick : MonoBehaviour
{
    public float DoubleClickInterval = 0.5f;
    public UnityEvent OnDoubleClick;

    float secondClickTimeout = -1;

    void Update()
    {

        if (Input.GetMouseButtonDown(0))
        {
            if (secondClickTimeout < 0)
            {
                // This is the first click, calculate the timeout
                secondClickTimeout = Time.time + DoubleClickInterval;
            }
            else
            {
                // This is the second click, is it within the interval 
                if (Time.time < secondClickTimeout)
                {
                    Debug.Log("Double click!");

                    // Invoke the event
                    OnDoubleClick.Invoke();

                    // Reset the timeout
                    secondClickTimeout = -1;
                }
            }

        }

        // If we wait too long for a second click, just cancel the double click
        if (secondClickTimeout > 0 && Time.time >= secondClickTimeout)
        {
            secondClickTimeout = -1;
        }

    }
}
另一答案

据我所知,从文档和论坛中,你需要检查使用Input.GetMouseButtonDown以及自第一次按下以来的时间,例如so

另一答案

除了使用按钮获取GetMouseButtonDown(int)之外,您还要跟踪记住检查哪个阶段是按钮。

TouchPhase

以上是关于UNITY - 如何为长按和单击/双击执行不同的操作?的主要内容,如果未能解决你的问题,请参考以下文章

检测音量按钮的长按和短按 - iOS

在HAL for STM32中实现单按、长按和双按功能

Vue 移动端的长按与触摸事件

UIbutton 长按和 Touch Up 里面

长按和鲍勃菜单[关闭]

具有单按和长按事件的 UIButton 快速