Простой таймер обратного отсчета Unity не работает (C #)

#c# #unity3d

#c# #unity3d

Вопрос:

Я пытаюсь добавить простой таймер обратного отсчета в свою игру в Unity, но таймер не отключается в игре. Язык программирования — C #.

Вот мой код:

 using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    private int score, highScore;
    public Text scoreText, highScoreText;

    private float time;
    public Text timeText;

    public bool started, gameOver;

    public GameObject gameOverPanel;
    public Text gameOverScore, gameOverHighScore;
    public Button playAgain;

    void Start()
    {
        instance = GetComponent<GameManager>();

        score = 0;
        scoreText.text = "Score: "   score;
        highScore = PlayerPrefs.GetInt("HighScore");
        highScoreText.text = "Highscore: "   highScore;

        time = 45;
        gameOver = false;
        UpdateTime();
    }

    void Update()
    {
        if (started)
        {
            time -= Time.deltaTime;
            UpdateTime();
            if (time <= 0)
            {
                GameOver();
            }
        }
    }

    public void IncreaseScore()
    {
        score  ;
        scoreText.text = "Score: "   score;
        time  = 5;
        UpdateTime();
    }

    public void StartTimer()
    {
        time = 45;
        started = true;
    }

    public void UpdateTime()
    {
        string minutes = Mathf.Floor(time / 60).ToString("00");
        string seconds = Mathf.Floor(time % 60).ToString("00");
        timeText.text = string.Format("Time: {0}:{1}", minutes, seconds);
    }

    private void GameOver()
    {
        time = 0;
        UpdateTime();
        started = false;
        gameOver = true;
        gameOverPanel.SetActive(true);
        gameOverScore.text = "Final Score: "   score;
        if (score > highScore)
        {
            gameOverHighScore.text = "High Score: "   score;
            PlayerPrefs.SetInt("HighScore", score);
        }
        else
        {
            gameOverHighScore.text = "High Score: "   score;
        }
    }

    public void LoadGame()
    {
        SceneManager.LoadScene("GameScene");
    }
}
 

Я думаю, что где-то в функции UpdateTime() есть проблема.
Я в основном следил за онлайн-уроками, чтобы попасть сюда, поскольку я всего лишь новичок, поэтому, пожалуйста, не судите слишком строго, и я сделаю все возможное, чтобы понять любые ответы, которые вы мне даете.
Я чувствую, что не допустил никаких ошибок, и я также не получаю никаких ошибок компиляции в своей консоли Unity.
Спасибо.

Комментарии:

1. Кажется, вы никогда не вызываете startTimer?

2. Кроме того, нигде Update() в опубликованном коде не отображаются вызовы…

3. @David вызов запуска и обновления — это вещь Unity (я думаю)

4. @DavidTansey потому что это Unity и Update и Start вызываются Untiy framework как сообщения

5. @JHBonarius спасибо за это — полезно знать!

Ответ №1:

вы никогда не вызываете таймер запуска.

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

 void Start()
{
    instance = GetComponent<GameManager>();

    score = 0;
    scoreText.text = "Score: "   score;
    highScore = PlayerPrefs.GetInt("HighScore");
    highScoreText.text = "Highscore: "   highScore;

    gameOver = false;
    StartTimer();
    UpdateTimer();
}
 

Потому что вы никогда не вызываете startTimer из своего метода start. ваша started переменная всегда false и никогда не обновляется.

Ответ №2:

Вам нужно присвоить переменной started значение true в Start() with started = true;

 void Start() {
    instance = GetComponent<GameManager>();

    score = 0;
    scoreText.text = "Score: "   score;
    highScore = PlayerPrefs.GetInt("HighScore");
    highScoreText.text = "Highscore: "   highScore;

    time = 45;
    gameOver = false;
    UpdateTime();
    started = true; //HERE
}
 

Если вы этого не сделаете, значение if (started) in Update() всегда равно false, поэтому код внутри никогда не будет запущен.

Комментарии:

1. Нет, потому что в чем тогда причина startTimer? Подумайте о единой ответственности / абстракции! Т.е. я уже пытался намекнуть на это в своем комментарии, но вся строка time=45 в Start должна быть заменена вызовом startTimer

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