поэтому я делаю 2D-контроллер персонажа, в котором, если удерживать мышь (долгий щелчок), игрок может установить направление, в котором он хочет выстрелить снарядом, и когда снаряд выстрелил и столкнулся с объектом, игрок может щелкнуть один раз (или дважды щелкните, если это лучше), чтобы поменять позицию персонажа на позицию снаряда. Я пытаюсь сделать это с помощью Input.onMouseButton и Input.onMouseButtonDown, но не могу понять. Спасибо всем, кто мне поможет!
UNITY - Как выполнить другое действие для длинного щелчка и одиночного щелчка/двойного щелчка?
Ответы (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) с помощью кнопки, вы хотите отслеживать, не забывайте проверять, на каком этапе находится кнопка.
person
IgnasiS
schedule
30.04.2019
boolean mousePressed = true; float mousePressDuration = 0
, а затем в вашем обновленииif mousePressed { mousePressDuration += time.deltaTime; }
Просто не забывайте, что onMouseButtonUp вы должны установить mousePressed обратно в false. - person TheBatman   schedule 30.04.2019