#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 должна быть заменена вызовом startTimer2. Ну, тот, кого SO сочтет подходящим, может запустить таймер. Я просто указывал, почему таймер не работал, что является ядром вопроса, и предоставлял простое решение в самом коде SO, чтобы было ясно, почему он не работал и как заставить его работать