Как решить проблему двойного щелчка в игре в Unity? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть эта проблема с двойным щелчком в игре. Я написал этот код, который проверяет ввод и возвращает тип полученного ввода.

В редакторе это работает просто отлично, но когда я экспортирую игру, она всегда возвращает тип двойного щелчка. Даже если я нажму только один раз. Не уверен, что вызывает эту проблему ..

Ниже приведен скрипт ввода мышью, а другой - как я использую его в других скриптах.

Сценарий ввода мыши:

using System.Collections;
using UnityEngine.EventSystems;

public class MouseInput : MonoBehaviour
{
    #region Variables

    private enum ClickType      { None, Single, Double }

    private static ClickType    currentClick    = ClickType.None;
    readonly float              clickdelay      = 0.25f;

    #endregion

    void OnEnable()
    {
        StartCoroutine(InputListener());
    }
    void OnDisable()
    {
        StopAllCoroutines();
    }

    public static bool SingleMouseClick()
    {
        if (currentClick == ClickType.Single)
        {
            currentClick = ClickType.None;
            return true;
        }

        return false;
    }
    public static bool DoubleMouseClick()
    {
        if (currentClick == ClickType.Double)
        {
            currentClick = ClickType.None;
            return true;
        }

        return false;
    }

    private IEnumerator InputListener()
    {
        while (enabled)
        {
            if (Input.GetMouseButtonDown(0))
            { yield return ClickEvent(); }

            yield return null;
        }
    }
    private IEnumerator ClickEvent()
    {
        if (EventSystem.current.IsPointerOverGameObject()) yield break;

        yield return new WaitForEndOfFrame();

        currentClick = ClickType.Single;
        float count = 0f;
        while (count < clickdelay)
        {
            if (Input.GetMouseButtonDown(0))
            {
                currentClick = ClickType.Double;
                yield break;
            }
            count += Time.deltaTime;
            yield return null;
        }
    }
}

Использование:

if (MouseInput.SingleMouseClick())
{
    Debug.Log("Single click");
    Select(true);
}
else if (MouseInput.DoubleMouseClick())
{
    Debug.Log("Double click");
    Select(false);
}

1 Ответ

1 голос
/ 22 марта 2019

Таким образом, в кадре Input.GetMouseButtonDown(0) оценивается как истинное, вы звоните в ClickEvent(), который затем уступает WaitForEndOfFrame();, а затем в конечном итоге возвращается к другому Input.GetMouseButtonDown(0)).

Ваша проблема в том, что WaitForEndOfFrame() ожидает до конца текущего кадра :

Ожидание до конца кадра после рендеринга всех камер и графического интерфейса пользователя, непосредственно перед отображением кадра наscreen.

Не дождется следующего следующего кадра .Из-за этого все значения, возвращаемые API Input, по-прежнему будут одинаковыми.Вы хотите yield return null вместо WaitForEndOfFrame().

...