как сделать запуск таймера по нажатию клавиши Unity3D - PullRequest
0 голосов
/ 22 февраля 2019

У меня следующий код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Timer : MonoBehaviour
{
    public Text timerText;
    public Text votingResults;
    public float periodToVote;
    //public float periodToStartVoting;

    private bool objectDestroyed;
    private bool timerIsRunning;
    private bool timesUp = false;
    private float time;

    // Use this for initialization
    void Start ()
    {
        votingResults.enabled = false;
        timerText.text = "Press on Space for voting to start";
        timerIsRunning = false;
        objectDestroyed = false;
        timesUp = false;
        time = Time.time;
    }

    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKeyDown("space"))
        {
            Debug.Log("The function is running correctly");
            time = Time.time;
            timerIsRunning = true;
            votingResults.enabled = true;
        }

        if (!objectDestroyed && timerIsRunning)
        {
            float votinEndingTime = periodToVote - Time.time;

            string minutes = ((int)votinEndingTime / 60).ToString();
            string seconds = (votinEndingTime % 60).ToString("f0");

            timerText.text = "Voting Ends in: " + "\n" + seconds;

            if (votinEndingTime < 0)
            {
                objectDestroyed = true;
                Destroy(timerText);
            }
        }
    }
}

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

Пожалуйста, если есть что-то, что неясно или требует более подробного объяснения, сообщите мне в комментариях.

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вместо того, чтобы делать это в Update, я бы порекомендовал Coroutine и запускал бы его только в Update, если выполняются условия, что делает его немного более безопасным и более простым в управлении.

public class Timer : MonoBehaviour
{
    public Text timerText;
    public Text votingResults;
    public float periodToVote;
    private bool isRunning;

    // Use this for initialization
    private void Start ()
    {
        votingResults.enabled = false;
        timerText.text = "Press on Space for voting to start";
    }

    private IEnumerator RunTimer()
    {
         isRunning = true;
         var passedTime = 0.0f;
         while(passedTime < periodToVote)
         {
              string minutes = Mathf.RoundToInt((periodToVote - passedTime) / 60).ToString();
              string seconds = Mathf.RoundToInt(periodToVote - passedTime).ToString("f0");
              timerText.text = "Voting Ends in: " + "\n" + seconds;

              passedTime += Time.deltaTime;
              yield return null;
         }

         Destroy(timerText);
    }

    // Update is called once per frame
    private void Update ()
    {
        if (if(!isRunning) && Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("Sarting Timer");
            votingResults.enabled = true;
            StartCoroutine(RunTimer());
        }
    }
}
0 голосов
/ 22 февраля 2019

Поскольку вы вычисляете votingEndingTime, используя Time.time, которое является текущим временем в вашей игре, и вычитать его не имеет смысла.Вы должны использовать время, когда нажато Space, и добавить к нему periodToVote, чтобы узнать, когда закончится голосование:

float votinEndingTime = periodToVote + time;

Поскольку time - это значение при нажатии Space.

Тогда вы можете проверить, истекло ли время следующим образом:

if(Time.time > votingEndingTime)
{
    objectDestroyed = true;
    Destroy(timerText);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...