UNITY - Как выполнить другое действие для длинного щелчка и одиночного щелчка/двойного щелчка?

поэтому я делаю 2D-контроллер персонажа, в котором, если удерживать мышь (долгий щелчок), игрок может установить направление, в котором он хочет выстрелить снарядом, и когда снаряд выстрелил и столкнулся с объектом, игрок может щелкнуть один раз (или дважды щелкните, если это лучше), чтобы поменять позицию персонажа на позицию снаряда. Я пытаюсь сделать это с помощью Input.onMouseButton и Input.onMouseButtonDown, но не могу понять. Спасибо всем, кто мне поможет!


person Munggo Lloyd    schedule 30.04.2019    source источник
comment
В onMouseButtonDown вы установите флаг boolean mousePressed = true; float mousePressDuration = 0, а затем в вашем обновлении if mousePressed { mousePressDuration += time.deltaTime; }Просто не забывайте, что onMouseButtonUp вы должны установить mousePressed обратно в false.   -  person TheBatman    schedule 30.04.2019


Ответы (3)


Для длинного клика вам просто нужно измерить количество времени, прошедшее с момента первого клика. Вот пример:

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;
        }

    }
}
person kevernicus    schedule 30.04.2019

Насколько я могу судить из документов и форумов, вам нужно будет проверить, используя Input.GetMouseButtonDown и время, прошедшее с момента первого нажатия, например так.

person TheEye    schedule 30.04.2019

Помимо получения GetMouseButtonDown(int) с помощью кнопки, вы хотите отслеживать, не забывайте проверять, на каком этапе находится кнопка.

TouchPhase

person IgnasiS    schedule 30.04.2019