Почему мой таймер не работает на Unity, когда я перестаю нажимать? - PullRequest
0 голосов
/ 30 мая 2019

Я работаю над проектом Unity, и мне нужно сосчитать время, которое пользователь затрачивает на следующий шаг.

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

Это мой скрипт для перетаскивания и таймера:

private float startPosX;
    private float startPosY;
    public bool isHeld;
    //private float distance = 10;
    private float stopTime;

private void OnMouseDrag()
{
        Vector2 mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
        Vector2 objectPos = Camera.main.ScreenToWorldPoint(mousePos);
        transform.position = objectPos;
}

void Update()
{
    if (isHeld) {
        OnMouseDrag();
    }
    if (Input.GetMouseButtonUp(0))
    {
        isHeld = false;
        Debug.Log(isHeld);
        stopTime += Time.deltaTime;
        string minutes = Mathf.Floor((stopTime % 3600) / 60).ToString("00");
        string seconds = (stopTime % 60).ToString("00");
        Debug.Log(minutes + ":" + seconds);
    }
}

private void OnMouseOver()
{
    if (Input.GetMouseButtonDown(0)) {
        isHeld = true;
        Debug.Log(isHeld);
    }
}

}

My onMouseDrag () - это фактическая функция, используемая для перетаскивания объекта, и onMouseOver обнаруживает, находится ли мышь над объектом. Таймер задается deltaTime, а затем я использую строковые минуты и секунды, чтобы лучше отобразить его и посмотреть, работает ли он правильно, но это не так. Я не знаю, почему это не работает, и мне нужна помощь, потому что я новичок в единстве и кодировании.

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Вы захотите прочитать документацию по классу Input, в частности проверяемую функцию GetMouseButtonUp:

Возвращает true во время кадра, который пользователь отпускаетуказанная кнопка мыши.

Вам необходимо вызывать эту функцию из функции Update, так как состояние сбрасывается в каждом кадре.Он не вернет истину, пока пользователь не нажмет кнопку мыши и не отпустит ее снова.значения кнопок 0 для левой кнопки, 1 для правой кнопки, 2 для средней кнопки.

Возможно, вы неправильно поняли, что делает эта функция.

Это регистрирует одно сообщение за клик или релиз:

void Update() {
    if (Input.GetMouseButtonDown(0)) {
        Debug.Log("once per click: mouse button clicked");
    }
    if (Input.GetMouseButtonUp(0)) {
        Debug.Log("once per click: mouse button released");
    }
}

Это регистрирует одно сообщение за кадр:

void Update() {
    if (Input.GetMouseButton(0)) {
        Debug.Log("once per frame: mouse button held");
    } else {
        Debug.Log("once per frame: mouse button NOT held");
    }
}

Это зависит только от того, хотите ли вы, чтобы что-то происходило один раз за клик / релиз илиодин раз за кадр.

1 голос
/ 30 мая 2019

Здесь есть пара вещей, которые вызывают у вас проблемы или будут вызывать проблемы.

  1. Input.GetMouseButtonUp(0) возвращает true ровно один раз в кадре, в котором обнаружено нажатие кнопки Update().При этом код в if(Input.GetMouseButtonUp(0)) будет выполняться только один раз для кадра, на котором отпущена кнопка мыши.Вот почему вы не видите ничего, напечатанного с Debug.Log или когда вы это делаете, это неправильно.
  2. Использование вами оператора по модулю % математически неверно для части minutes вашего кода,Mathf.Floor(stopTime / 60).ToString("00") даст вам правильные минуты.

Я бы предложил структурировать это так:

void Update()
{
    if (Input.GetMouseButton(0)) {
        isHeld = true;
    }
    else
    {
        isHeld = false;
        Debug.Log(isHeld);
        stopTime += Time.deltaTime;
        string minutes = Mathf.Floor(stopTime / 60).ToString("00");
        string seconds = (stopTime % 60).ToString("00");
        Debug.Log(minutes + ":" + seconds);
    }
}

private void OnMouseOver()
{
    if (isHeld) {
        Debug.Log(isHeld);
        OnMouseDrag();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...